如何使用javascript中的currying编写具有无限数量参数的sum函数?

时间:2017-09-18 19:09:02

标签: javascript currying

我尝试编写以下代码来查找' n'使用和函数的数字。我在输出中得到了正确的答案。但我无法使用sum函数返回,因为我总是要返回一个函数,这是curry effect所必需的。

请帮忙。提前谢谢。



var output = 0,
  chain;

function sum() {
  var args = Array.prototype.slice.call(arguments);
  output += args.reduce(function(a, b) {
    return a + b;
  });
  sumCurried = sum.bind(output);
  sumCurried.val = function() {
  return output;
  }
  return sumCurried;

}
debugger;
document.getElementById('demo').innerHTML = sum(1, 2)(3)(4);
// document.getElementById('demo').innerHTML = sum(1)(3)(4);

<p id='demo'></p>
&#13;
&#13;
&#13;

enter code here

2 个答案:

答案 0 :(得分:0)

例如,您可以向curried函数添加一个停止条件 - 如果在没有参数的情况下调用该函数,则返回输出:

var output = 0,
  chain;

function sum() {
  var args = Array.prototype.slice.call(arguments);
  
  if(args.length === 0) {
    return output;
  }
  
  output += args.reduce(function(a, b) {
    return a + b;
  });
  sumCurried = sum.bind(output);
  
  return sumCurried;

}

console.log(sum(1, 2)(3)(4)());
<p id='demo'></p>

返回的curry函数有一个val属性,该函数返回当前值:

var output = 0,
  chain;

function sum() {
  var args = Array.prototype.slice.call(arguments);
  output += args.reduce(function(a, b) {
    return a + b;
  });
  sumCurried = sum.bind(output);
  sumCurried.val = function() {
    return output;
  }
  return sumCurried;

}

console.log(sum(1, 2)(3)(4).val());
<p id='demo'></p>

答案 1 :(得分:0)

你为什么要使用咖喱?但是,这是一个较短的版本:

 const sum = (...args) => {
   const func = (...s)=> sum(...args,...s);
   func.value = args.reduce((a,b)=>a+b,0);
   return func;
 };

 //usable as
sum(1,2).value,
sum(1,1)(1).value,
sum(1,1)(1,1)(1,1).value

你总是需要结束曲线链。但是,它可以缩短:

  func.valueOf = ()=> args.reduce((a,b)=>a+b,0);
  //( instead of func.value = ... )

所以,当你打电话时,你可以这样做:

  +sum(1,2,3)
 +sum(1)(1)(1)