我是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。
答案 0 :(得分:5)
do
构造在任何 monad中工作,并且您在两个不同的monad中使用它。
在第一种情况下,
pairs xs ys = do x <- xs
y <- ys
return (x, y)
您正在列表monad中工作,即[]
。您可以看到,因为您使用x <- xs
而xs
的类型为[something]
。
在第二种情况下
eval (Val n) = Just n
eval (Div x y) = do n <- eval x
m <- eval y
safediv n m
您正在Maybe
monad工作。实际上,您使用y <- eval x
和eval
返回Maybe something
。
每个monad都定义了自己关于<-
应该是什么意思的规则。在列表monad中,它大致意味着&#34;考虑所有可能的元素&#34;,在Maybe one&#34;中取x
Just x
,否则&#34;。< / p>
从技术上讲,<-
中的do
构造被调用到>>=
运算符的调用中,每个monad都独立定义。