829 字
4 分钟
柯里化(Currying)

什么是柯里化(Currying)#

柯里化(Currying)是将一个接受多个参数的函数转换为一系列只接受单一参数的函数的技术。换句话说,柯里化将一个多参数函数拆分成多个单参数函数,每个函数返回下一个函数,直到所有参数都被提供为止。 例如,假设有一个函数 add(a, b),它接受两个参数并返回它们的和。通过柯里化,我们可以将其转换为如下形式:

function add(a) {
return function (b) {
return a + b;
};
}

使用柯里化后的函数可以这样调用:

function add(a) {
return function (b) {
return a + b;
};
}
const add5 = add(5); // 返回一个新函数,等待第二个参数
const result = add5(3); // 传入第二个参数,返回结果
console.log(result); // 输出 8

柯里化的优点#

  1. 部分应用:柯里化允许你创建部分应用的函数,即预先填充一些参数,生成一个新的函数。这在需要多次调用同一函数但参数不同的情况下非常有用。
  2. 提高代码复用性:通过柯里化,可以创建更通用的函数,减少重复代码,提高代码的复用性。
  3. 函数组合:柯里化使得函数组合变得更加容易,因为每个函数只处理一个参数,可以更灵活地组合不同的函数。
  4. 延迟执行:柯里化允许你延迟函数的执行,直到所有参数都被提供为止,这在某些情况下可以提高性能。

例如,我们有一个用于格式化和输出信息的日志函数 log(level, message),通过柯里化,我们可以创建一个专门用于错误日志的函数:

const errorLog = curry(log)("error");
errorLog("Something went wrong");

现在,errorLog 函数只需要传入消息参数,而日志级别已经被预设为 “error”。

实现柯里化的通用函数#

下面是一个实现柯里化的通用函数 curry

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));
};
}
};
}

说明:

  • curry 函数接受一个函数 fn 作为参数,并返回一个新的函数 curried
  • curried 函数使用剩余参数语法 ...args 来收集传入的参数。
  • 如果传入的参数数量大于或等于原函数 fn 的参数数量,则调用 fn 并返回结果。
  • 如果参数数量不足,则返回一个新的函数,继续收集参数,直到参数数量满足要求。

使用示例:

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 sum(a, b, c) {
return a + b + c;
}
const curriedSum = curry(sum);
console.log(curriedSum(1)(2)(3)); // 输出 6
console.log(curriedSum(1, 2)(3)); // 输出 6
console.log(curriedSum(1)(2, 3)); // 输出 6
console.log(curriedSum(1, 2, 3)); // 输出 6

结论#

柯里化是一种强大的函数式编程技术,可以提高代码的灵活性和复用性。通过将多参数函数转换为一系列单参数函数,柯里化使得函数的部分应用、组合和延迟执行变得更加容易。在实际开发中,合理使用柯里化可以帮助我们编写更简洁、可维护的代码。

柯里化(Currying)
https://fuyuki.fun/posts/前端/柯里化/
作者
Fuyuki_Vila
发布于
2025-10-07
许可协议
CC BY-NC-SA 4.0
Music Off