如果我们有两个函数f
和g
,那么在Haskell中h = f . g
相当于h x = f(g x)
。即功能从右到左应用于输入。有什么根本原因可以从右到左,而不是从左到右?即为什么他们不会h = f . g
相当于h x = g(f x)
?
答案 0 :(得分:14)
首先,你的[原始未经编辑的]问题存在错误:
h = f。 g等于h x = g(f x)
- 事实并非如此:h = f . g
相当于h x = f (g x)
。
然而,至于为什么会这样,而不是相反,这很可能是因为它是如何运作的,并且在数学方面起作用;见http://en.wikipedia.org/wiki/Function_composition:
[...] 复合函数表示为g∘f:X→Z ,由(g∘f)(x)= g定义(对于 X 中的所有 x ,f(x))。
由于平等(f . g) x == f (g x)
,它也很直观 - 如您所见,f
和g
的顺序在双方都是相同的。
此外,如果你想要一个例子,那么创建你自己的“反向组合”算子是微不足道的。可读性:
(.>) = flip (.)
这样
Prelude> ((+1) .> (*2)) 3
8
Prelude> ((+1) . (*2)) 3
7
事实上,你可以使用Control.Arrow.(>>>)
对功能做同样的事情,但更通用,也适用于其他事情:
Prelude Control.Arrow> ((+1) >>> (*2)) 3
8