2015-12-12 9 views
15

sono confusa sul motivo per cui ho questo in GHCidifficoltà a capire il tipo di sequenza [Basta, Basta]

:t sequence [Just,Just] 
sequence [Just, Just] :: a -> [Maybe a] 

Elaborare, posso capire sequence [Just 1, Just 2] :: Num a => Maybe [a] perché quando guardando il tipo di sequenza

sequence :: (Monad m, Traversable t) => t (m a) -> m (t a) 

è chiaro che questa funzione accetta una raccolta di valori monadici e restituisce un singolo valore monadico della raccolta. Pertanto, quando chiamiamo sequence [Just 1, Just 2] dovremmo recuperare uno Just di [1,2]. Seguendo questo treno di pensieri, non dovrebbe sequence [Just, Just] restituire un singolo Just?

Grazie.

risposta

22

Il secondo sequence funziona in una monade diversa.

Per la prima:

sequence [Just 1, Just 2] 

abbiamo che Just 1 :: Maybe a e questo è un valore nel Maybe monade. Concretamente, il tipo [Maybe a] corrisponde a t (m b) come richiesto dalla sequenza e otteniamo t ~ [], m ~ Maybe, b ~ a - da cui la monade Maybe.

Per la seconda:

sequence [Just, Just] 

abbiamo che Just :: a -> Maybe a. In quale monade è questo? Ora il tipo [a -> Maybe a] corrisponde a t (m b) e otteniamo t ~ [], m ~ (->) a, b ~ Maybe a - quindi ora stiamo lavorando nella monade (->) a e non più nello Maybe.

In questa monade (->) a, che è isomorfa alla monade Reader a, abbiamo per es.

sequence [f, g, h] = \x -> [f x, g x, h x] 

Infatti, un calcolo con la (->) a monade è un calcolo "lettura di un argomento implicito di tipo a". La funzione sequence trasforma semplicemente un elenco di tali calcoli ([(->) a b], ovvero [a -> b]) in un singolo calcolo che legge l'argomento implicito solo una volta e produce un elenco con tutti i risultati ((->) a [b], ovvero a -> [b]).

+0

bello! grazie! –

Problemi correlati