Javascript函数式编程 - 我应该编写强制currying的函数,还是在调用时使用_.curry?

时间:2017-02-20 17:11:21

标签: javascript functional-programming currying

示例:

版本1:

const foo = (arg1) => {
  return (arg2) => {
    return (arg3) => {
      return arg1 + arg2 + arg3;
    }
  }
}
// called as part of a pipe: 
const result = pipe(bar, foo(arg1)(arg2), baz);

第2版:

const foo = (arg1, arg2, arg3) => {
  return arg1 + arg2 + arg3;
}

// called as part of a pipe: 
const result = pipe(bar, _curry(foo)(arg1)(arg2), baz);

在版本2中,方法实现更清晰,更优雅,但是调用有点丑陋。由于方法调用(希望)出现在代码库中的多个位置,我正在尝试确定哪个版本具有较少的缺点。

我希望我不需要解释为什么我想使用curried函数并传递单个参数。请从功能性编程的角度来处理问题。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以使用该函数的arguments对象,以防您不知道有多少参数可能是这样的:



function foo() {
  var sum = 0;
  for(var i = 0; i < arguments.length; i++)
    sum += arguments[i];
  return sum;
}

console.log(foo());
console.log(foo(1, 2, 3));
console.log(foo(5, 6, 3, 7, 1, 10));
&#13;
&#13;
&#13;

如果你想要一个独立于参数数量的currying而不使用_.curry强制它,那么使用它:

&#13;
&#13;
function foo(a) {
  var sum = 0;
  var _ = function(a) {
    if(a === undefined)
      return sum;
    else {
      sum += a;
      return _;
    }
  }
  return _(a);
}

console.log(foo());
console.log(foo(1)(2)());
console.log(foo(1)(2)(7)(10)(5)());
&#13;
&#13;
&#13;