2017-02-14 22 views

ответ

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

desugars к

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

Поскольку тип >>= является Monad m => m a -> (a -> m b) -> m b и в аргументе Just 3 (альтернативно Just 5) мы имеем m ~ Maybe, возвращаемый тип выражения должен быть какой-то Maybe типа.


Существует возможность сделать это возвращение [[3, 5]], используя то, что называется natural transformations от category theory. Поскольку существует естественный переход от Maybe a к [a], а именно

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

мы имеем, что нужная функция просто естественное преобразование применяется к результату:

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

Поскольку это естественное преобразование, то можно также применить alpha первую и вашу функцию второй:

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

Как @duplode указал O ut, вы можете найти alpha в пакете Data.Maybe как maybeToList.

+1

Возможно, стоит упомянуть, что эта 'alpha' доступна как' maybeToList' из 'Data.Maybe'. – duplode