【发布时间】:2019-03-24 10:38:18
【问题描述】:
我在 redux compose 函数中遇到了这种模式。我仍然不明白在下面的示例中,函数是如何从最后一个而不是从第一个开始评估的:
function f2(a) {
return a + a;
}
function f3(a) {
return a + a + a;
}
function f4(a) {
return a + a + a + a;
}
function f5(a) {
return a + a + a + a + a;
}
function compose(...funcs) {
return funcs.reduce(function x(a, b) {
return function y(...args) {
const temp = a(b(...args));
return temp;
};
});
}
const composedFunction = compose(f2, f3, f4, f5);
const result = composedFunction(2);
在第一次reduce 迭代中,累加器是f2,所以我们将得到f2(f3(2))=12。在下一次迭代中,我们将调用f4(12)=48。在最后一次迭代中,我们将调用f5(48)=240。所以评估顺序是f5(f4(f2(f3(2))))。但是使用console.log,我看到评估顺序是f2(f3(f4(f5(2)))),巧合的是240。
据我了解,函数 y 被所有数组元素调用,那么为什么只有最后一个函数将 2 作为参数?
【问题讨论】:
-
compose的错误实现。最重要的是 1) 它不是一个完整的函数。使用x => x(身份函数)作为初始累加器,reduce的第二个参数,2)支持最里面的函数的多个参数是愚蠢和昂贵的 - 你只需要支持一元函数组合,以及 3)temp毫无意义,您立即跳过变量和return。即const comp = (f,g) => x => f(g(x)); const compose = (...fs) => fs.reduce(comp, x => x)
标签: javascript functional-programming evaluation