今天看源码看到了柯里化的利用,过去从来没注意这块知识,上午手动实现了一个简单的将任意函数转化为柯里化形式。
function curry(fn, args, length) {
let arg = args || [];
let len = length === undefined ? fn.length : length;
return function f(...rest) {
arg = arg.concat(rest);
const restLen = len - rest.length;
if (restLen > 0) {
return curry(fn, arg, restLen);
}
return fn.apply(null, arg);
}
}
效果如下:
function add(a, b, c) { return a + b + c; }
const toCurry = curry(add);
toCurry(1, 2, 3); // 6
toCurry(1)(2)(3); // 6
toCurry(1, 2)(3); // 6
toCurry(1)(2, 3); // 6
利用这个函数,我们可以解决一道面试题:
实现一个add函数,效果如下:
console.log(add(1, 2)(3)); // 6
console.log(add(1)(2)(3)); // 6
console.log(add(1)(2, 3)); // 6
利用上面的curry
函数,可以很容易实现:
function add(...rest) {
const _add = (a, b, c) => a + b + c;
return curry(_add).apply(null, rest);
}