微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

了解Haskell中Monad的bind运算符的关联性

如何解决了解Haskell中Monad的bind运算符的关联性

我试图理解Monad的bind运算符的工作原理,但是发现了一个奇怪的例子,因为考虑到>>= 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 :: ()

我不理解它,因为第二个示例与第三个示例相反,因为它似乎与已知的关联性相矛盾。我知道我缺少什么,但我不知道什么。

解决方法

根据最大的munch规则,lambda被尽可能地解析到右侧,因此>>=运算符的左侧关联性没有机会发挥作用。将您的第二个代码段解析为第一个代码段,而不是第三个代码段(当然这是无效的代码)。

,

这是因为括号使x超出了范围:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。