Fonction de somme Variadic Curry

J'ai besoin d'une fonction de somme js pour fonctionner comme ceci:

sum(1)(2) = 3 sum(1)(2)(3) = 6 sum(1)(2)(3)(4) = 10 etc. 

J'ai entendu dire que cela ne peut pas être fait. Mais a entendu dire que si l'ajout de + devant la sum peut être fait. Comme +sum(1)(2)(3)(4) .
Des idées sur la façon de faire cela?

Je ne sais pas si j'ai compris ce que vous voulez, mais

 function sum (n) { var v = function (x) { return sum (n + x); }; v.valueOf = v.toString = function () { return n; }; return v; } console.log(+sum(1)(2)(3)(4)); 

JsFiddle

Je publie cette révision comme son propre poste, car je n'ai apparemment pas assez de réputation pour ne plus le laisser comme un commentaire. Il s'agit d'une révision de l'excellente solution de @Rafael.

 function sum (n) { var v = x => sum (n + x); v.valueOf = () => n; return v; } console.log(+sum(1)(2)(3)(4)); //10 

Je n'ai pas vu une raison de garder le v.toString bit, car il ne semblait pas nécessaire. Si j'ai commis une erreur en faisant cela, faites-le moi savoir dans les commentaires pourquoi v.toString est requis (il a passé mes tests bien sans ça). Convertit le reste des fonctions anonymes en fonctions fléchées pour faciliter la lecture.

Il s'agit d'un exemple d'utilisation de parenthèses vides dans le dernier appel comme une touche de fermeture (de ma dernière interview):

Somme (1) (4) (66) (35) (3) ()

  function sum(numberOne) { var count = numberOne; return function by(numberTwo) { if (numberTwo === undefined) { return count; } else { count += numberTwo; return by; } } } console.log(sum(1)(4)(66)(35)(3)()); 

Vous pouvez utiliser la fonction ci-dessous

 function add(num){ add.sum || (add.sum = 0) // make sure add.sum exists if not assign it to 0 add.sum += num; // increment it return add.toString = add.valueOf = function(){ var rtn = add.sum; // we save the value return add.sum = 0, rtn // return it before we reset add.sum to 0 }, add; // return the function } 

Puisque les fonctions sont des objets, nous pouvons y ajouter des propriétés, que nous réinitialisons lors de leur accès.

Pour rendre la sum(1) appelable en sum(1)(2) , elle doit retourner une fonction.

La fonction peut être appelée ou convertie en un nombre avec valueOf .

 function sum(a) { var sum = a; function f(b) { sum += b; return f; } f.toString = function() { return sum } return f } 

Comme il s'agit d'une question d'entrevue commune, voici ma prise en utilisant les propriétés de la fonction pour ajouter la mémoisation à la fonction somme () et simplifier son code un peu:

 function sum(x) { sum.result = (sum.result) ? sum.result += x : x; sum.valueOf = function() { return sum.result; } return sum; } sum(1)(2)(3); // == 6