如何在未知数量的参数上计算函数

时间:2016-08-28 02:49:47

标签: javascript currying

假设我有一个名为multiplyDivide

的函数

如果我打电话给multiplyDivide(2)(3)(4)(6),则相当于2 * 3 / 4 * 6

更新 如果我事先不知道将要采用多少参数,是否可以编写这样的函数?例如,我可以multiplyDivide(1)(2)multiplyDivide(1)(2)(3)(4)...(n-1)(n)

5 个答案:

答案 0 :(得分:9)

这有点可能,但您需要定义终止条件,因为问题与编写递归函数的问题基本相同。该函数需要一种方法来告诉天气它应该返回一个函数或一个值。

您如何表达对价值的需求取决于您。一种方法是检查参数是否通过:

textFieldA

现在你可以做到:

DocumentListener

否则它会返回一个你可以继续调用的函数:

// Using add instead of multiplyDivide to simplify example:

function add (num) {
    function adder (n) {
        if (n !== undefined) {
            num += n;
            return adder;
        }
        else { // terminate
            return num;
        }
    }
    return adder;
}

由于在js函数中是对象,因此您还可以将值getter实现为静态方法。它不是纯粹的功能,但使“API”更明确,更容易阅读:

var sum = add(1)(2)(3)(4)();

允许你这样做:

var x = add(1)(2)(3)(4);
x = x(5)(6)(7);
x = x(8)(9)(10);

var sum = x();

您甚至可以通过覆盖内置的function add (num) { function adder (n) { num += n; return adder; } adder.value = function(){ return num }; return adder; } var sum = add(1)(2)(3)(4).value(); 方法来获得幻想:

.valueOf()

允许你这样做:

.toString()

这里的关键是你需要一种告诉函数停止返回函数的方法。

答案 1 :(得分:3)

为什么要进行咖喱?通过提供n参数来“重载”函数会不会更容易?

function multiplyDivide() {
  var result = arguments[0];
  for (var i = 1; i < arguments.length; i++) {
    result = (i % 2) ? (result * arguments[i]) : (result / arguments[i]);
  }
  return result;
}

console.log(multiplyDivide(2, 3, 4, 6)); //9
console.log(multiplyDivide(5, 4, 2, 3, 3, 5, 1)); //50

答案 2 :(得分:0)

你的意思是这样吗?

 Cupl world

答案 3 :(得分:0)

这实际上是一个非常好的问题......

Currying是函数式编程语言最基本的方面之一,您可以在其中传递函数并返回函数。 JS在某种程度上是一种函数式编程语言,应该能够执行此操作。

所以就像你问题中的那个人一样,为了这个或那个原因,人们可能想要无限期地讨论许多论证函数。

好的,让你的功能

function multiplyDivide (n,m,o,p){
  return n * m / o * p;
}

然后实现实用程序curry函数以获取任何给定函数的curried版本的方法如下:

var curry = f => f.length ? (...a) => curry(f.bind(f,...a)) : f(),

让我们看看它的实际效果

function multiplyDivide (n,m,o,p){
      return n * m / o * p;
    }

var curry = f => f.length ? (...a) => curry(f.bind(f,...a)) : f(),
    f     = curry(multiplyDivide);
 
 res1 = f(4,5,2,10),
 res2 = f(4)(5,2,10),
 res3 = f(4)(5)(2,10),
 res4 = f(4)(5)(2)(10),
 res5 = f(4,5)(2,10),
 res6 = f(4,5)(2)(10),
 res7 = f(4,5,2)(10),
 res8 = f(4,5)(2,10);
console.log(res1,res2,res3,res4,res5,res6,res7,res8);

可能有更简单的方法,但这是我能想到的。

答案 4 :(得分:0)

function addValues(a, b) {
   if(b!=undefined)
    return a + b;

   return function(b) {
       return a + b;
   }
}
let output1 = addValues(2)(4);  // 6
let output2 = addValues(2,1);   // 3
console.log(output1);
console.log(output2)