【发布时间】:2016-06-09 14:15:22
【问题描述】:
函数组成从右到左:
const comp = f => g => x => f(g(x));
const inc = x => x + 1;
const dec = x => x - 1;
const sqr = x => x * x;
let seq = comp(dec)(comp(sqr)(inc));
seq(2); // 8
seq(2)转化为dec(sqr(inc(2))),申请顺序为inc(2)...sqr...dec。因此,函数以与传递给comp 的相反顺序调用。这对 Javascript 程序员来说并不直观,因为他们习惯于从左到右的方法链接:
o = {
x: 2,
inc() { return this.x + 1, this },
dec() { return this.x - 1, this },
sqr() { return this.x * this.x, this }
}
o.dec().sqr().inc(); // 2
我认为这令人困惑。这是一个颠倒的构图:
const flipped = f => g => x => g(f(x));
let seql = flipped(dec)(flipped(sqr)(inc));
seql(2); // 2
函数组合从右到左有什么原因吗?
【问题讨论】:
-
"因此函数的求值顺序与其应用程序的相反" - 嗯,什么?
-
您似乎在问为什么在函数调用(左)之前评估参数(右),不是吗?
-
如果
seq写成comp(comp(dec)(sqr))(inc)对你来说更有意义吗? (函数组合是可交换的) -
@Bergi 我改写了有问题的句子
-
@Bergi 嗯,这不会改变事实,comp 从右到左进行评估。我没有任何问题,我只是问为什么?
标签: javascript functional-programming composition associative function-composition