Haskell monads和do声明

时间:2014-10-12 20:19:03

标签: haskell monads

我是monad的新手,并且使用do-statement的以下结构让我很困惑:

pairs xs ys = do x <- xs
                 y <- ys
                 return (x, y)

我被告知这应该返回所有可能的x和y对,我不明白,因为我之前教过以下代码:

eval (Val n) = Just n
eval (Div x y) = do n <- eval x
                    m <- eval y
                    safediv n m

表示:执行eval x,然后保留其结果(如果不等于Nothing(否则返回Nothing)为n,然后保持eval y相同,然后如果两者都不是Nothing它会进入结合两个结果的最终函数safediv(否则也返回Nothing。)

然而,函数pairs中第一次使用do语句的工作方式完全不同?

如果有人可以帮我解决这个问题并解释do-statement及其结构的实际功能,那就非常感激了!

祝你好运, Skyfe。

1 个答案:

答案 0 :(得分:5)

do构造在任何 monad中工作,并且您在两个不同的monad中使用它。

在第一种情况下,

pairs xs ys = do x <- xs
                 y <- ys
                 return (x, y)

您正在列表monad中工作,即[]。您可以看到,因为您使用x <- xsxs的类型为[something]

在第二种情况下

eval (Val n) = Just n
eval (Div x y) = do n <- eval x
                    m <- eval y
                    safediv n m

您正在Maybe monad工作。实际上,您使用y <- eval xeval返回Maybe something

每个monad都定义了自己关于<-应该是什么意思的规则。在列表monad中,它大致意味着&#34;考虑所有可能的元素&#34;,在Maybe one&#34;中取x Just x,否则&#34;。< / p>

从技术上讲,<-中的do构造被调用到>>=运算符的调用中,每个monad都独立定义。