CodeWalk

什么是柯里化(Currying)?请实现一个通用的柯里化函数。

作者:Yahuda · 2026-05-30 12:55

请解释柯里化的概念、用途,并手写一个通用的柯里化函数。

回答

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