为什么 Haskell 中的点从右到左组成?

Why does the dot compose from right to left in Haskell?

如果我们有两个函数,fg,那么在Haskell中h = f . g等价于h x = f(g x)。 IE。这些函数从右到左应用于输入。它从右到左而不是从左到右有什么根本原因吗? IE。他们为什么不让 h = f . g 等同于 h x = g(f x)

编辑:正如其他人指出我的等效函数的错误方式,所以我修复了这些。

首先,您的[原始,未经编辑]问题有误:

h = f . g is equivalent to h x = g(f x)

——这不是真的:h = f . g 等价于 h x = f (g x).

但是,至于为什么是这样而不是相反,这很可能是因为它就是这样工作的,并且在数学中也起作用;见 http://en.wikipedia.org/wiki/Function_composition:

[...] composite function is denoted g ∘ f : X → Z, defined by (g ∘ f )(x) = g(f(x)) for all x in X.

这也很直观,因为 (f . g) x == f (g x) 相等 - 如您所见,fg 的顺序在两侧相同。


此外,创建自己的 "reverse composition" 运算符是微不足道的,如果您出于以下原因需要一个运算符。可读性:

(.>) = flip (.)

所以

Prelude> ((+1) .> (*2)) 3
8
Prelude> ((+1) . (*2)) 3
7

事实上,您可以只使用 Control.Arrow.(>>>),它对函数有同样的作用,但更通用,也适用于其他事情:

Prelude Control.Arrow> ((+1) >>> (*2)) 3
8