2016-04-05 30 views
8

Ho scavato in Haskell negli ultimi mesi, mi sono imbattuto in una situazione con monadi che Non sono abbastanza sicuro su come gestirlo.Haskell (a -> ma) -> m (a -> a) -> m (a -> a)

Ho un valore di tipo a -> m a ed un secondo tipo di m (a -> a) e devo comporli tale che il risultato del primo finisce come ingresso nella del secondo e produce un m (a -> a) se possibile. Sono stato bloccato su questo per il giorno passato ora e non sto avvolgendo la mia mente intorno ad esso. Suppongo che sto cercando una funzione come (a -> m a) -> m (a -> a) -> m (a -> a). Posso fornire un esempio più concreto se ha più senso.

+2

È possibile * ordinare * fare ciò che si chiede se si è disposti a eseguire le azioni monadiche associate a tutti i possibili valori di input 'a' in una volta in primo piano. Occasionalmente questo è quello che vuoi - ma di solito no. –

risposta

13

Non è possibile farlo, in generale. Il problema è il tuo tipo di risultato: m (a -> a). Questa è una singola azionemonadica che produce una funzione; ma il tuo primo input ha il formato a -> m a, che (potenzialmente) produce una azione monadica differente per ogni argomento. Quindi, ad esempio, per il [] monad [a -> a] è un elenco di funzioni con una lunghezza fissa, mentre a -> [a] può avere una lunghezza diversa per ciascun argomento. Quindi non c'è modo di "spingere" di nuovo il tipo di funzione nello m in generale; vedere What is the general case of QuickCheck's promote function? per una domanda SO correlata.

Se a -> m a avrebbe funzionato per quello che ti serve, allora si può trasformare il vostro argomento m (a -> a) in a -> m a utilizzando

\ x -> fmap ($ x) af 

e utilizzare >=> (o <=<, non è chiaro dai vostri tipi) per comporre le funzioni insieme.

+0

Sì! La funzione richiesta per eseguire il downgrade di un'azione Monad su un'azione Applicative, che è impossibile. Quello che dovrebbero invece fare è aggiornare l'azione Applicativa ad un'azione Monad. –

+0

Questo è generalmente quello che ho pensato che avrei dovuto fare. Proprio non avevo ancora le parole per ragionare. –

Problemi correlati