【问题标题】:Inverse of >> operator in haskellhaskell中>>运算符的逆
【发布时间】:2016-04-07 21:09:12
【问题描述】:

所以我的代码在使用 monad 时看起来与我使用应用程序和仿函数时相似,我一直使用 =<< 而不是 >>=。我也一直在使用<* 而不是*> / >>。但是我注意到<**> 不同,=<<>>= 不同。

例如:

print 5 <* print 6

给我:

5
6

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

在进一步玩弄之后,似乎&lt;**&gt; 仅在返回值上有所不同,而在函数组合/排序等方面没有区别。而=&lt;&lt;&gt;&gt;= 的正确翻转,包括从左到右的固定性切换。

我想知道为什么会这样(看起来&gt;&gt;= 是倒退的,但它在某种程度上更适合&lt;*&gt;&lt;**&gt; 组合,而不是倒退,即使@ 的类型签名987654344@ 和 &lt;*&gt; 被翻转)。我还想知道是否有我可以/应该使用的 &lt;&lt; 样式运算符。

作为一个附带问题,当涉及到=&lt;&lt; 时,左右关联性何时会有所不同,似乎无论你把括号放在哪里,结果都是一样的,尽管我承认我只测试过相当简单的例子。

【问题讨论】:

标签: haskell monads applicative


【解决方案1】:

是的,*&gt;&lt;* 只是它们的返回值不同。

它在某种程度上更适合&lt;*&gt; &lt;* *&gt; 组合,而不是向后组合,即使 &gt;&gt;=&lt;*&gt; 的类型签名被翻转

我不会说&gt;&gt;=&lt;*&gt; 的签名被翻转了。相反,&lt;*&gt; 只是专门用于在其左参数中包含一个函数,然后将applied 用于右参数中的值。你也可以使用&gt;&gt;= 来做到这一点,考虑

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

我认为不需要&lt;&lt; 的应用等效项,就像不需要++ 的翻转版本一样:只需按顺序排列*&gt;&lt;* 的参数你需要你想要的语义!

当谈到=&lt;&lt;时,左右关联性是否会有所不同,似乎无论你把括号放在哪里,结果都是一样的

呃,这不正确。右边带括号的版本甚至都不是很好的类型。也许您已经尝试了一些使用 lambda 的示例,但在您的括号中没有考虑到这些?

【讨论】:

  • “只需按照你想要的语义的顺序排列*&gt;&lt;*的参数!”。对=&lt;&lt;&gt;&gt;= 的需求难道不能说同样的话吗?同样对于关联性,我的意思是(pure =&lt;&lt; pure) =&lt;&lt; pure 5 vs pure =&lt;&lt; (pure =&lt;&lt; pure 5)
  • 对于带有函数参数的中缀组合器,您需要考虑这些组合器通常与 lambdas(它给出一个自然的从左到右方向)或无点组合链(从右到左)一起使用,所以这里任何一个方向都可能有明显的好处。但这与*&gt; 无关,就像它与++ 无关。 — Rg。关联性,小心:只有右括号表达式才是可能的,因为恰好有一个函数 monad 实例。 pures 生活在不同的单子中!
  • @semicolon 函数先参考。并非所有函数都立即或根本不需要其参数的值。参看。例如take 1 ( (1:) $ undefined ).
  • @semicolon sum $ take 10 $ fmap (+ 5) $ repeat 3 是右-关联,但评估顺序确实从左到右开始。
  • @semicolon:我不确定在 Haskell 中谈论任何“指称方向”是否有意义。考虑('H':)$('e':)$('l':)$('l':)$('o':)$"World"。这不是从左到右吗?
猜你喜欢
  • 2011-05-04
  • 2014-09-08
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多