假设我有以下代码
do {x <- (Just 3); y <- (Just 5); return (x:y:[])}
哪个输出Just [3,5]
haskell如何知道输出值应该在Maybe
monad中?我的意思是return
可以输出[[3, 5]]
。
答案 0 :(得分:18)
do {x <- (Just 3); y <- (Just 5); return (x:y:[])}
desugars to
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
类型。
有可能使用natural transformations中名为category theory的内容返回[[3, 5]]
。因为存在从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指出的那样,您可以在alpha
包中找到Data.Maybe
maybeToList
。