逆的>> haskell的运营商

时间:2016-04-07 21:09:13

标签: haskell monads applicative

因此,当我使用应用程序和仿函数时,我使用monads时我的代码看起来很相似,而我使用的是=<<而不是>>=。我一直在使用<*而不是*> / >>。但是我注意到<*不是*> =<<>>=的内容。

例如:

print 5 <* print 6

给了我:

5
6

当我希望他们以相反的方式打印时,调用print 6,打印6,然后结果()被抛弃,然后调用print 5

进一步玩游戏之后,似乎<**>仅在返回值方面有所不同,而在于如何组合/排序函数。而=<<>>=的正确翻转,包括从左到右的固定切换。

我想知道为什么会出现这种情况(似乎>>=似乎是倒退的,但它在某种程度上更符合<*> <* *>组合而不是倒退,即使>>=<*>的类型签名被翻转)。我也想知道是否有一个<<样式的运算符我可以/应该使用。

作为一个侧面问题,左边与右边的关联性在=<<时甚至有所不同,似乎无论你把括号放在哪里,结果都是一样的,尽管我承认只有用相当简单的例子进行测试。

1 个答案:

答案 0 :(得分:2)

是的,*><*的回报值不同。

  即使<*><*的类型签名被翻转,

它在某种程度上更适合*> >>= <*>组合而不是向后。 / p>

我不会说>>=<*>的签名被翻转。相反,<*>只是专门用于在其左参数中包含一个函数,然后是applied到右参数中的值。您也可以使用>>=执行此操作,请考虑

fs<*>xs ≡ fs >>= \f -> f<$>xs

我认为不需要等同于<<的应用程序,就像不需要++的翻转版本一样:只需命令*>的参数或按照所需语义的顺序<*

  

左边与右边的关联性甚至会对=<<产生影响,似乎无论你把括号放在哪里,结果都是一样的

呃,那不对。右边的parens版本甚至没有很好的类型。也许你已经尝试过使用lambdas的一些例子,并没有将这些与你的parens一起考虑?