代码实现
// 定义add函数
function add(a, b) {
return a + b;
}
// 定义multiply函数
function multiply(a, b) {
return a * b;
}
// 定义square函数
function square(x) {
return x * x;
}
// 柯里化add函数
function curriedAdd(a) {
return function(b) {
return a + b;
};
}
// 柯里化multiply函数
function curriedMultiply(a) {
return function(b) {
return a * b;
};
}
// 柯里化square函数
function curriedSquare(x) {
return function() {
return x * x;
};
}
// 组合函数
function compose(...fns) {
return function(x) {
return fns.reduceRight((acc, fn) => fn(acc), x);
};
}
// 使用组合和柯里化实现compute函数
const compute = compose(
curriedSquare,
curriedMultiply(2),
curriedAdd
);
// 测试compute函数
console.log(compute(3)(4));
组合和柯里化的作用解释
- 柯里化的作用:
- 柯里化将一个多参数函数转化为一系列单参数函数。例如,
add(a, b)
函数通过柯里化变为 curriedAdd(a)(b)
,这使得函数更加灵活。在 compute
函数的构建中,柯里化后的函数可以方便地作为组合函数的一部分。比如 curriedMultiply(2)
固定了 multiply
函数的第一个参数为2,这样后续只需要传入第二个参数就可以进行乘法运算。
- 组合的作用:
- 组合函数
compose
接受一系列函数,并返回一个新函数。新函数会按照从右到左的顺序依次调用传入的函数,将前一个函数的返回值作为下一个函数的参数。在 compute
函数中,通过 compose
函数将 curriedSquare
、curriedMultiply(2)
和 curriedAdd
组合起来,实现了 square(multiply(add(a, b), 2))
的计算逻辑。组合使得代码更加模块化和可维护,每个函数只负责单一的功能,通过组合可以构建出复杂的计算逻辑。