【发布时间】:2016-04-07 21:09:12
【问题描述】:
所以我的代码在使用 monad 时看起来与我使用应用程序和仿函数时相似,我一直使用 =<< 而不是 >>=。我也一直在使用<* 而不是*> / >>。但是我注意到<* 与*> 不同,=<< 与>>= 不同。
例如:
print 5 <* print 6
给我:
5
6
当我期望他们以相反的方式打印时,print 6 被调用,打印 6,然后结果 () 被丢弃,然后调用 print 5。
在进一步玩弄之后,似乎<* 和*> 仅在返回值上有所不同,而在函数组合/排序等方面没有区别。而=<< 是>>= 的正确翻转,包括从左到右的固定性切换。
我想知道为什么会这样(看起来>>= 是倒退的,但它在某种程度上更适合<*><**> 组合,而不是倒退,即使@ 的类型签名987654344@ 和 <*> 被翻转)。我还想知道是否有我可以/应该使用的 << 样式运算符。
作为一个附带问题,当涉及到=<< 时,左右关联性何时会有所不同,似乎无论你把括号放在哪里,结果都是一样的,尽管我承认我只测试过相当简单的例子。
【问题讨论】:
标签: haskell monads applicative