[英]Haskell monads and the do statement
我是monads的新手,它的使用以及使用do语句的以下结构使我非常困惑:
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
的最终函数safediv
(否则返回Nothing
)。
但是在函数pairs
第一次使用do语句的工作原理完全不同吗?
如果有人可以帮助我解决这个问题,并解释do语句及其结构的真正适当功能,将不胜感激!
最好的问候,Skyfe。
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都定义其有关<-
含义的规则。 在列表单子,它大致的意思是“考虑所有可能的因素”,在也许有“拿x
中Just x
,否则失败。”
从技术上讲, do
的<-
构造被减为对>>=
运算符的调用,每个monad独立定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.