[英]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.