总和函数currying

Tec*_*ner 3 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);
Run Code Online (Sandbox Code Playgroud)

另外,我可以编写一个执行以下操作的通用函数吗?add(1)(2)(3)或add(1)(2)(3)()=> 6

Sam*_*mVK 5

要获得任意数量的调用,所有调用都需要数字,您需要返回值作为函数数字依赖.以便:

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

除了我称之为黑客之外,我无论如何都无法想到这样做(或者如果有一个很好的理由应该这样做).



话虽如此,为了好玩,我能够通过滥用来做到以下几点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
Run Code Online (Sandbox Code Playgroud)

但这显然不是非常犹太.


编辑:从使用切换toString()valueOf()@ PatrickRoberts的评论.