求和函数currying

时间:2018-09-01 02:34:23

标签: javascript currying

我正在尝试编写执行以下操作的求和函数:

sum(1)(2)(3) => returns 6

但是,我的解决方案很难。我知道我犯了一个愚蠢的错误,有人可以指出我正确的方向吗?

我的实现:

function add(args) {
  let sum = args[0];
  let func = function(...args2) {
    if (!args2[0]) return sum;
    sum += args2[0];
    return func;
  }
  return func;
}


add(1)(2)(3);

此外,我可以编写执行以下操作的泛型函数吗? add(1)(2)(3)或add(1)(2)(3)()=> 6

4 个答案:

答案 0 :(得分:5)

要具有任意数量的调用(全部都包含一个数字),您需要返回值既可以作为函数又可以作为依赖于数字。这样:

const five = add(2)(3);
console.log(five(10)); // behaves like a function
console.log(five + 10); // behaves like a number

除了我所说的“骇客”,我想都没想到要这么做(或者,如果有充分的理由,一个人应该这么做)。



话虽如此,为了娱乐,我能够通过滥用valueOf()来完成以下工作:

const add = (num1) => {
  const func = (num2) => add(num1 + num2);
  func.valueOf = () => num1;

  return func;
}

console.log(add(1)(2)(3)); // *logs function* [output varies by environment]

console.log(add(1)(2)(3) + 10);  // 16
console.log(add(1)(2) + 10);  // 13
console.log(add(1) + 10);  // 11

console.log(add(1)(2)(3) == 6); // true
console.log(add(1)(2)(3) === 6); // false

console.log(typeof add(1)(2)(3)); // function
console.log(typeof (add(1)(2) + 3)); // number

但这显然不是很洁净。


编辑: :根据@PatrickRoberts的comment从使用toString()切换到valueOf()

答案 1 :(得分:0)

尝试一下,您省略了传播运算符

function add(...args) {
        let sum = args[0];
        let func = function(...args2) {
            if(args2[0] === undefined) return sum;
            sum += args2[0];
            return func;
        }
        return func;
    }
    
    
    console.log(add(1)(2)(3)());

欢呼!

答案 2 :(得分:0)

递归有人吗?

function add(n) {
  return function(m) {
    if (isNaN(m)) return n;
    return add(n + m);
  };
}

// add(1)(2)(3)() => 6
// add(1)(2)(3)("")() => "6"
// add(1)("2")(3)() => "123"

// functional one liner
const add = n => m => isNaN(m) ? n : add(n + m);

答案 3 :(得分:0)

function sum(x){
   return function (y){
      return function(z){
        return x+y+z;
     }
   }
}

您可以像这样致电:     sum(1)(2)(3)