我是monad的新手,它的使用和使用do语句的以下结构使我很困惑:
pairs xs ys = do x <- xs
y <- ys
return (x, y)
Run Code Online (Sandbox Code Playgroud)
我被告知这应该返回所有可能的x和y对,我不明白,因为我之前教过以下代码:
eval (Val n) = Just n
eval (Div x y) = do n <- eval x
m <- eval y
safediv n m
Run Code Online (Sandbox Code Playgroud)
意思是:执行eval x,然后保持其结果,如果不等于Nothing(否则返回Nothing)as n,然后相同eval y,然后如果两者都没有Nothing,它将进入safediv结合两个结果的最终函数(否则返回Nothing).
但是,函数中第一次使用do语句的pairs工作方式完全不同?
如果有人可以帮我解决这个问题,并解释一下do语句及其结构的实际功能,我们将不胜感激!
最好的问候,Skyfe.
该do构造适用于任何 monad,并且您在两个不同的monad中使用它.
在第一种情况下,
pairs xs ys = do x <- xs
y <- ys
return (x, y)
Run Code Online (Sandbox Code Playgroud)
你正在列表monad工作,即[].你可以看到,因为你用x <- xs和xs是类型[something].
在第二种情况下
eval (Val n) = Just n
eval (Div x y) = do n <- eval x
m <- eval y
safediv n m
Run Code Online (Sandbox Code Playgroud)
你在Maybemonad 工作.的确,你使用y <- eval x并eval返回Maybe something.
每个monad都定义了自己的<-意思.在列表单子,它大致的意思是"考虑所有可能的因素",在也许有"走x的Just x,并且不能以其他方式".
从技术上讲,a中的<-构造do被描述为对>>=操作符的调用,每个monad都独立定义.