繁体   English   中英

了解 Haskell 中 Monad 绑定运算符的结合性

[英]Understanding associativity of the Monad's bind operator in Haskell

我试图理解 Monad 的绑定运算符是如何工作的,但发现了一个奇怪的例子,因为考虑到>>=关联的事实,明显的关联性对我来说没有意义。 这是在解释器提示下进行测试的示例:

> Just 3 >>= \x -> Just "!" >>= \y -> Just (show x ++ y)
Just "3!"

> Just 3 >>= (\x -> Just "!" >>= (\y -> Just (show x ++ y)))
Just "3!"

> (Just 3 >>= \x -> Just "!" )>>= \y -> Just (show x ++ y)
<interactive>:3:50: error: Variable not in scope: x :: ()

我不明白,因为第二个例子与第三个例子相反,因为它似乎与已知的结合性相矛盾。 我知道我错过了一些东西,但我不知道是什么。

根据最大蒙克规则,lambda 会尽可能向右解析,因此>>=运算符的左结合性没有机会发挥作用。 第一个片段是您的第二个片段,而不是第三个片段(这当然是无效代码)。

这是因为括号将x出范围:

(Just 3 >>= \x -> Just "!" ) >>= \y -> Just (show x ++ y)

(Just 3 >>= \\x -> Just "!" )将变成Just "!" , x将超出范围。

暂无
暂无

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

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