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

时间:2017-02-14 15:08:51

标签: haskell monads

假设我有以下代码

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

哪个输出Just [3,5]

haskell如何知道输出值应该在Maybe monad中?我的意思是return可以输出[[3, 5]]

1 个答案:

答案 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