柯里化函数(Currying)是一种函数式编程技巧,它把一个接收多个参数的函数,转换成一系列只接收单一参数的函数。换句话说,原来你可能写 fn(a, b, c),柯里化之后,就变成了 fn(a)(b)(c)。
举个例子
function add(a, b, c) {
return a + b + c;
}
add(1, 2, 3); // 6
柯里化后:
function curryAdd(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}
curryAdd(1)(2)(3); // 6
柯里化工具函数
上述例子,我们手动创建了一个柯里化函数curryAdd。但是,更好的方式是,使用工具函数柯里化原始函数。
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
// Enough arguments → call the original function
return fn.apply(this, args);
} else {
// Not enough arguments → return a new function
return function (...nextArgs) {
return curried.apply(this, args.concat(nextArgs));
};
}
};
}
const curryAdd = curry(add);
curryAdd(1)(2)(3)
如上代码,curry就是工具函数,它接受一个原始函数,并返回一个新函数curried。在curried函数中,当接收的参数长度小于原始函数长度时,返回一个合并参数的新函数。否则,使用合并完的参数,调用原始函数。
通用的curry工具函数,可以柯里化任意函数,无需再手动为特定函数编写柯里化函数。
阅读到这里,你大概会有为什么要柯里化的疑惑,那我们一起来继续探讨一下这个问题。