制作支持currying的功能和传统的多参数

时间:2017-02-05 23:15:52

标签: javascript functional-programming currying

  

问题:你如何做这项工作?
  添加(2)(5); // 7
  加(2,5); // 7

我想解决上面的问题: 我知道第一个解决方案使用currying并将按如下方式实现:

var add = functoin(x){
return function (y){
return x+y;
};
};

而第二个是正常功能:

var add = functoin(x,y){
return x+y;
};

有没有办法让两者同时工作?

2 个答案:

答案 0 :(得分:3)

你可以检查传入的参数数量,并根据它返回一个或多个:



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




答案 1 :(得分:2)

您可以使用更高阶的函数来包装具有该行为的其他函数。

这种函数通常称为curry,它附带了许多库(例如lodash)。

curry返回一个新函数,用于检查是否已提供所有预期参数。如果有,则调用originalFunction。如果不是,则返回部分应用的函数,

此实现使用Function#length来测试call arity,因此它适用于任意数量的参数。

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