因此,当我使用应用程序和仿函数时,我使用monads时我的代码看起来很相似,而我使用的是=<<
而不是>>=
。我一直在使用<*
而不是*>
/ >>
。但是我注意到<*
不是*>
=<<
到>>=
的内容。
例如:
print 5 <* print 6
给了我:
5
6
当我希望他们以相反的方式打印时,调用print 6
,打印6,然后结果()
被抛弃,然后调用print 5
。
进一步玩游戏之后,似乎<*
和*>
仅在返回值方面有所不同,而在于如何组合/排序函数。而=<<
是>>=
的正确翻转,包括从左到右的固定切换。
我想知道为什么会出现这种情况(似乎>>=
似乎是倒退的,但它在某种程度上更符合<*>
<*
*>
组合而不是倒退,即使>>=
和<*>
的类型签名被翻转)。我也想知道是否有一个<<
样式的运算符我可以/应该使用。
作为一个侧面问题,左边与右边的关联性在=<<
时甚至有所不同,似乎无论你把括号放在哪里,结果都是一样的,尽管我承认只有用相当简单的例子进行测试。
答案 0 :(得分:2)
是的,*>
和<*
的回报值不同。
即使<*>
和<*
的类型签名被翻转,它在某种程度上更适合
*>
>>=
<*>
组合而不是向后。 / p>
我不会说>>=
和<*>
的签名被翻转。相反,<*>
只是专门用于在其左参数中包含一个函数,然后是applied到右参数中的值。您也可以使用>>=
执行此操作,请考虑
fs<*>xs ≡ fs >>= \f -> f<$>xs
我认为不需要等同于<<
的应用程序,就像不需要++
的翻转版本一样:只需命令*>
的参数或按照所需语义的顺序<*
!
左边与右边的关联性甚至会对
=<<
产生影响,似乎无论你把括号放在哪里,结果都是一样的
呃,那不对。右边的parens版本甚至没有很好的类型。也许你已经尝试过使用lambdas的一些例子,并没有将这些与你的parens一起考虑?