了解 Haskell 中 Monad 的绑定运算符的关联性
Understanding associativity of the Monad's bind operator in Haskell
我试图理解 Monad 的绑定运算符是如何工作的,但发现了一个奇怪的例子,因为考虑到 >>=
是 [=17= 这一事实,明显的结合性对我来说没有意义]left-联想。这是示例,在解释器的提示下进行测试:
> 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 :: ()
我不明白,因为第二个例子与第三个例子相反,因为它似乎与已知的结合律相矛盾。我知道我错过了什么,但我不知道是什么。
这是因为括号 x
超出了范围:
(Just 3 >>= \x -> Just "!" ) >>= \y -> Just (show x ++ y)
(Just 3 >>= \x -> Just "!" )
将变为 Just "!"
,并且 x
将超出范围。
根据最大 munch 规则,lambda 被解析为尽可能向右,因此 >>=
运算符的左结合性没有机会发挥作用。第一个片段被解析为您的第二个片段,而不是第三个片段(这当然是无效代码)。
我试图理解 Monad 的绑定运算符是如何工作的,但发现了一个奇怪的例子,因为考虑到 >>=
是 [=17= 这一事实,明显的结合性对我来说没有意义]left-联想。这是示例,在解释器的提示下进行测试:
> 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 :: ()
我不明白,因为第二个例子与第三个例子相反,因为它似乎与已知的结合律相矛盾。我知道我错过了什么,但我不知道是什么。
这是因为括号 x
超出了范围:
(Just 3 >>= \x -> Just "!" ) >>= \y -> Just (show x ++ y)
(Just 3 >>= \x -> Just "!" )
将变为 Just "!"
,并且 x
将超出范围。
根据最大 munch 规则,lambda 被解析为尽可能向右,因此 >>=
运算符的左结合性没有机会发挥作用。第一个片段被解析为您的第二个片段,而不是第三个片段(这当然是无效代码)。