2015-12-12 3 views
15

Jestem zdezorientowany, dlaczego mam to w GHCikłopoty ze zrozumieniem rodzaj sekwencji [prostu, po prostu]

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

Aby opracować, mogę zrozumieć sequence [Just 1, Just 2] :: Num a => Maybe [a] bo patrząc na rodzaj sekwencji

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

Oczywiste jest, że ta funkcja pobiera zbiór monadycznych wartości i zwraca pojedynczą monadyczną wartość kolekcji. Tak więc, gdy zadzwonimy pod numer sequence [Just 1, Just 2], powinniśmy odzyskać Just z [1,2]. Czy po tym zestawie myśli, nie powinno być sequence [Just, Just] zwrócenie pojedynczego Just?

Dzięki.

Odpowiedz

22

Drugi sequence działa w innej monadzie.

Na pierwszy:

sequence [Just 1, Just 2] 

mamy że Just 1 :: Maybe a i jest to wartość w Maybe monady. Konkretnie, typ [Maybe a] jest dopasowywany do t (m b) zgodnie z wymaganiami sekwencji, i otrzymujemy t ~ [],, b ~ a - stąd monada Maybe.

Na drugi:

sequence [Just, Just] 

mamy że Just :: a -> Maybe a. Która monada to jest? Teraz typ [a -> Maybe a] jest dopasowany do t (m b) i otrzymujemy t ~ [], m ~ (->) a, b ~ Maybe a - stąd teraz pracujemy w monadzie (->) a i już nie w tej Maybe.

W tej monadzie (->) a, która jest izomorficzna z monadą Reader a, mamy np.

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

Rzeczywiście, obliczenie z (->) a monadzie jest obliczenie „odczyt niejawnego argumentu typu a”. Funkcja sequence po prostu przekształca listę takich obliczeń ([(->) a b], tj. [a -> b]) w pojedyncze obliczenie, które odczytuje niejawny argument tylko jeden raz, i tworzy listę z wszystkimi wynikami: ((->) a [b], tj. a -> [b]).

+0

fajnie! Dziękuję Ci! –