哈斯克尔:在莫纳德做符号并返回

Ati*_*tin 6 monads haskell

假设我有以下代码

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.MaybemaybeToList.