2017-08-11 23 views

答えて

7

次の引数の関数を返すことができ、toStringメソッドを実装できます。関数型プログラミングで

function sum() { 
 
    var add = function (a, b) { return a + b; }, 
 
     value = Array.prototype.reduce.call(arguments, add, 0); 
 

 
    function f() { 
 
     value = Array.prototype.reduce.call(arguments, add, value); 
 
     return f; 
 
    }; 
 
    f.toString = function() { return value; }; 
 
    return f; 
 
} 
 

 
console.log(sum(5, 5)); 
 
console.log(sum(5)(5)); 
 
console.log(sum(3, 4, 5)(6, 7));

+0

私は修正された、それはスマートな解決策です –

1

、何を求めていることはをカリー化の概念に基づいています。 Curryingは、不定数のパラメータを部分的に適用する関数を可能にします。これは、いったんカレー化されると、引き数に引数と操作を格納し、次の引き数でフィードするための別の関数を返します。

ハスケルのような言語では、これはすべての関数の自然な振る舞いですが、JSではありません。しかしJSは関数の一種であり、関数を渡したり返すことができるので、カリングはまだかなり達成可能です。

OKマルチ引数関数を総称してカリングする方法を見てみましょう。

function sum(n,m,o,p){ // uncurried standard function 
 
    return n + m + o + p; 
 
} 
 
    
 
function curry(fn){ // takes an uncurried function and returns a curried function 
 
    return function(...a){ 
 
      return a.length >= fn.length ? fn(...a) 
 
             : curry(fn.bind(fn,...a)); 
 
     }; 
 
} 
 

 
var csum = curry(sum); // now csum is the curried version of sum 
 
console.log(csum(1,2,3,4));  // <- 10 
 
console.log(csum(1)(2,3,4));  // <- 10 
 
console.log(csum(1,2)(3,4));  // <- 10 
 
console.log(csum(1,2,3)(4));  // <- 10 
 
console.log(csum(1)(2)(3,4)); // <- 10 
 
console.log(csum(1)(2)(3)(4)); // <- 10

関連する問題