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
.
Возможно, стоит упомянуть, что эта 'alpha' доступна как' maybeToList' из 'Data.Maybe'. – duplode