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

Rag*_*iis 2 monads haskell bind operators operator-precedence

我试图理解如何单子的绑定运营商的作品,却发现这是一个奇怪的例子,因为明显的关联性没有意义,我考虑到这样的事实>>=留下-associative。这是在解释器提示下进行测试的示例:

> 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 :: ()
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*ess 5

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