什么是柯里化(Currying)?请实现一个通用的柯里化函数。
请解释柯里化的概念、用途,并手写一个通用的柯里化函数。
回答
Yahuda
柯里化:将接收多个参数的函数转换为一系列接收单个参数的函数(或逐步接收参数直到参数满足要求后执行原函数)。
用途:
- 参数复用:固定部分参数,生成新函数(偏函数思想)
- 延迟执行:参数不齐时不执行,收集齐后再计算
- 函数组合:便于组合成更复杂的函数
通用实现:
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...args2) {
return curried.apply(this, args.concat(args2));
};
}
};
}
// 进阶版(占位符支持)
function curryAdv(fn, placeholder = '_') {
return function curried(...args) {
const filled = args.slice(0, fn.length);
const hasPlaceholder = filled.includes(placeholder);
if (filled.length >= fn.length && !hasPlaceholder) {
return fn.apply(this, args);
}
return (...next) => {
const merged = args.map(a => a === placeholder && next.length ? next.shift() : a);
return curried(...merged, ...next);
};
};
}
使用示例:
const add = (a, b, c) => a + b + c;
const curriedAdd = curry(add);
curriedAdd(1)(2)(3); // 6
curriedAdd(1, 2)(3); // 6
curriedAdd(1)(2, 3); // 6