假设我有以下代码
do {x <- (Just 3); y <- (Just 5); return (x:y:[])}
Run Code Online (Sandbox Code Playgroud)
哪个输出 Just [3,5]
haskell如何知道输出值应该是Maybemonad?我的意思是return可以输出[[3, 5]].
Thr*_*eFx 18
do {x <- (Just 3); y <- (Just 5); return (x:y:[])}
Run Code Online (Sandbox Code Playgroud)
des to to to
Just 3 >>= \x -> Just 5 >>= \y -> return $ x:y:[]
Run Code Online (Sandbox Code Playgroud)
由于我们有>>=is Monad m => m a -> (a -> m b) -> m b和per参数的类型Just 3(或者Just 5)m ~ Maybe,表达式的返回类型必须是某种Maybe类型.
有一种可能性,使这一回归[[3, 5]]使用一些所谓的自然变换的范畴论.由于存在从一个自然转化Maybe a到[a],即
alpha :: Maybe a -> [a]
alpha Nothing = []
alpha (Just a) = [a]
Run Code Online (Sandbox Code Playgroud)
我们有你想要的功能只是应用于结果的自然变换:
alpha (Just 3 >>= \x -> Just 5 >>= \y -> return $ x:y:[])
-- returns [[3, 5]]
Run Code Online (Sandbox Code Playgroud)
由于这是一个自然的转换,你也可以alpha先应用你的第二个功能:
alpha (Just 3) >>= \x -> alpha (Just 5) >>= \y -> return $ x:y:[]
-- returns [[3, 5]]
Run Code Online (Sandbox Code Playgroud)
作为@duplode指出的那样,你可以找到alpha在包Data.Maybe的maybeToList.