为什么 Haskell 中的点从右到左组成?
Why does the dot compose from right to left in Haskell?
如果我们有两个函数,f
和g
,那么在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)
相等 - 如您所见,f
和 g
的顺序在两侧相同。
此外,创建自己的 "reverse composition" 运算符是微不足道的,如果您出于以下原因需要一个运算符。可读性:
(.>) = flip (.)
所以
Prelude> ((+1) .> (*2)) 3
8
Prelude> ((+1) . (*2)) 3
7
事实上,您可以只使用 Control.Arrow.(>>>)
,它对函数有同样的作用,但更通用,也适用于其他事情:
Prelude Control.Arrow> ((+1) >>> (*2)) 3
8
如果我们有两个函数,f
和g
,那么在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)
相等 - 如您所见,f
和 g
的顺序在两侧相同。
此外,创建自己的 "reverse composition" 运算符是微不足道的,如果您出于以下原因需要一个运算符。可读性:
(.>) = flip (.)
所以
Prelude> ((+1) .> (*2)) 3
8
Prelude> ((+1) . (*2)) 3
7
事实上,您可以只使用 Control.Arrow.(>>>)
,它对函数有同样的作用,但更通用,也适用于其他事情:
Prelude Control.Arrow> ((+1) >>> (*2)) 3
8