繁体   English   中英

Haskell monads和do语句

[英]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都定义其有关<-含义的规则。 在列表单子,它大致的意思是“考虑所有可能的因素”,在也许有“拿xJust x ,否则失败。”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM