2017-02-14 38 views
6

Załóżmy, że mam następujący kodHaskell: do zapisu i powrót w monady

do {x <- (Just 3); y <- (Just 5); return (x:y:[])} 

które wyjścia Just [3,5]

jaki sposób Haskell wiedzieć, że wartość produkcji powinna być w Maybe monady? Mam na myśli return może wyprowadzać [[3, 5]].

Odpowiedz

18
do {x <- (Just 3); y <- (Just 5); return (x:y:[])} 

desugars do

Just 3 >>= \x -> Just 5 >>= \y -> return $ x:y:[] 

Ponieważ typ >>= jest Monad m => m a -> (a -> m b) -> m b i za argumentem Just 3 (alternatywnie Just 5) mamy m ~ Maybe, typ powrotu ekspresji musi istnieć Maybe typu.


Istnieje możliwość, aby ten powrót [[3, 5]] za pomocą czegoś, co nazywa natural transformations z category theory. Ponieważ istnieje naturalną transformację od Maybe a do [a], mianowicie

alpha :: Maybe a -> [a] 
alpha Nothing = [] 
alpha (Just a) = [a] 

mamy, że żądana funkcja jest po prostu naturalna transformacja odniesione na wynik:

alpha (Just 3 >>= \x -> Just 5 >>= \y -> return $ x:y:[]) 
-- returns [[3, 5]] 

Ponieważ jest to naturalna transformacja, ty można również zastosować alpha pierwszy i swoją funkcję drugiego

alpha (Just 3) >>= \x -> alpha (Just 5) >>= \y -> return $ x:y:[] 
-- returns [[3, 5]] 

Jak @duplode wskazał O ut, można znaleźć alpha w pakiecie Data.Maybe jako maybeToList.

+1

Warto wspomnieć, że ten "alpha" jest dostępny jako 'maybeToList' z' Data.Maybe'. – duplode