Make 函数支持柯里化和传统的多参数
Make function that supports currying AND the traditional multiple parameters
Question: How would you make this work?
add(2)(5); // 7
add(2, 5); // 7
我正在尝试解决上面的问题:
我知道第一个解决方案使用 currying 并将按如下方式实现:
var add = functoin(x){
return function (y){
return x+y;
};
};
而第二个只是您的正常功能:
var add = functoin(x,y){
return x+y;
};
有没有办法让两者同时工作?
您可以检查传入的参数数量,return 一个或两个取决于它:
function add(a, b) {
if (arguments.length == 2) {
return a + b;
}
return function(b) {
return add(a, b);
}
}
console.log(add(2)(5)); // 7
console.log(add(2, 5)); // 7
您可以使用 higher-order 函数来包装具有该行为的其他函数。
这种函数常被称为curry
,它自带很多库(例如lodash)。
curry
returns 一个新函数,用于检查是否已提供所有预期参数。如果有,它会调用 originalFunction
。如果不是,它 returns 部分应用函数,
此实现使用 Function#length
来测试调用参数,因此它适用于任意数量的参数。
function curry (fn) {
return function (...args) {
if (args.length >= fn.length) {
return fn.call(this, ...args)
} else {
return curry(fn.bind(this, ...args))
}
}
}
function add (x, y) {
return x + y;
}
// You can curry any function!
const curriedAdd = curry(add);
console.log(curriedAdd(1, 2)); // 3
console.log(curriedAdd(1)(2)); // 3
console.log(curriedAdd(1)); // a function
Question: How would you make this work?
add(2)(5); // 7
add(2, 5); // 7
我正在尝试解决上面的问题: 我知道第一个解决方案使用 currying 并将按如下方式实现:
var add = functoin(x){
return function (y){
return x+y;
};
};
而第二个只是您的正常功能:
var add = functoin(x,y){
return x+y;
};
有没有办法让两者同时工作?
您可以检查传入的参数数量,return 一个或两个取决于它:
function add(a, b) {
if (arguments.length == 2) {
return a + b;
}
return function(b) {
return add(a, b);
}
}
console.log(add(2)(5)); // 7
console.log(add(2, 5)); // 7
您可以使用 higher-order 函数来包装具有该行为的其他函数。
这种函数常被称为curry
,它自带很多库(例如lodash)。
curry
returns 一个新函数,用于检查是否已提供所有预期参数。如果有,它会调用 originalFunction
。如果不是,它 returns 部分应用函数,
此实现使用 Function#length
来测试调用参数,因此它适用于任意数量的参数。
function curry (fn) {
return function (...args) {
if (args.length >= fn.length) {
return fn.call(this, ...args)
} else {
return curry(fn.bind(this, ...args))
}
}
}
function add (x, y) {
return x + y;
}
// You can curry any function!
const curriedAdd = curry(add);
console.log(curriedAdd(1, 2)); // 3
console.log(curriedAdd(1)(2)); // 3
console.log(curriedAdd(1)); // a function