为什么点在Haskell中从右到左构成?

Tid*_*ddo 7 haskell function-composition

如果我们有两个功能,f并且g,然后在Haskell h = f . g相当于h x = f(g x).即功能从右到左应用于输入.有什么根本原因可以从右到左,而不是从左到右?也就是说他们为什么不h = f . g相同h x = g(f x)呢?

编辑:正如其他人指出我的等效功能错误的方式,所以我修复了那些.

Eri*_*lun 14

首先,你的[原始的,未经编辑的]问题存在错误:

h = f.g相当于hx = g(fx)

- 那不是真的:h = f . g相当于h x = f (g x).

然而,至于为什么它是这样而不是相反的方式,它很可能是因为它是如何工作的并且在数学方面起作用; 见http://en.wikipedia.org/wiki/Function_composition:

[...] 复合函数被表示为克∘F:X→Z ,由下式定义(克∘F)(X)= G(F(X))的所有XX.

由于平等,它也很直观(f . g) x == f (g x)- 正如你所看到的,双方的顺序fg相同.


此外,如果您因为可读性而需要运营商,那么创建自己的"逆向组合"运算符是微不足道的:

(.>) = flip (.)
Run Code Online (Sandbox Code Playgroud)

以便

Prelude> ((+1) .> (*2)) 3
8
Prelude> ((+1) . (*2)) 3
7
Run Code Online (Sandbox Code Playgroud)

事实上,你可以只使用Control.Arrow.(>>>)哪个功能相同,但更通用,也适用于其他事情:

Prelude Control.Arrow> ((+1) >>> (*2)) 3
8
Run Code Online (Sandbox Code Playgroud)

  • 传统的是; 直觉不是.它使文本的顺序与图表的顺序相反,这非常令人讨厌. (7认同)
  • 换句话说,如果类型从左向右流动(如在`f:a-> b`和`g:b-> c`中),那么我们也应该有`(x)f`(vs`f(x) `)和`(x)(f.g):a - > b`; 那么一切都将真正一致和直观. (4认同)
  • 范畴理论中的"图".那就是:如果你有一个函数`f:a-> b`和另一个`g:b-> c`,那么以相反的顺序编写构成箭头/函数/态射的`gf`会感觉不自然. (3认同)
  • 是的,但也许首先应该是`f:b <-a`,因为我们也从右到左应用参数(`fx`而不是'xf`)...因此,我会说' (f.g)x == f(gx)`至少与`fx`一致,因为参数从右到左"流过"函数. (3认同)
  • ...这可能是为什么很多人喜欢OO风格的原因:`xf().g()`. (3认同)
  • @ErikAllik理查德·伯德的"编程代数"在类型签名中使用翻转合成和翻转箭头,因此有一些先例. (2认同)
  • @ErikAllik但是现在想想,我意识到我的观点没有我昨天想象的那么有趣。“数据流的方向”只不过是与您编写参数的顺序相反的内容。所以自然你不可能以相同的顺序获得这两个参数(除非你走面向对象路线并专门对待一个参数,然后只考虑特殊参数的“流程”......语法设计实际上比我更聪明已经意识到)。 (2认同)