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
.
Warto wspomnieć, że ten "alpha" jest dostępny jako 'maybeToList' z' Data.Maybe'. – duplode