Haskell monads和do声明

use*_*349 1 monads haskell

我是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.

chi*_*chi 5

do构造适用于任何 monad,并且您在两个不同的monad中使用它.

在第一种情况下,

pairs xs ys = do x <- xs
                 y <- ys
                 return (x, y)
Run Code Online (Sandbox Code Playgroud)

你正在列表monad工作,即[].你可以看到,因为你用x <- xsxs是类型[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 xeval返回Maybe something.

每个monad都定义了自己的<-意思.在列表单子,它大致的意思是"考虑所有可能的因素",在也许有"走xJust x,并且不能以其他方式".

从技术上讲,a中的<-构造do被描述为对>>=操作符的调用,每个monad都独立定义.