2015-11-24 23 views
5

私は現在、個人的な時間にプログラミング問題に取り組んでいます。このように呼び出される。最後の関数呼び出しで値を返す任意の回数呼び出すことができるカレット化されたjavascript関数を書く

add(1) // 1 
add(1)(2) // 3 
add(1)(2)(3); // 6 
add(1)(2)(3)(4); // 10 
add(1)(2)(3)(4)(5); // 15 

最後の呼び出しで値を返す方法はわかりません。例えば

は、add(1)(2)が機能するために、次にadd(1)関数を返すことがあるが、自身が呼び出されたときに指示add(1)に係る1を返します。

私はこれを克服することができると仮定していますが、何度も連続してadd関数が呼び出されていますが、それを達成する方法は考えられません。誰かが正しい方向に私を指すことができるヒントを持っていますか?

私は関数カリングでこれら2つの記事(12)を読んだことがありますが、それらを理解していますが、可変数の引数を扱うときにカールする方法がわかりません。

+2

だから、何をしようとしたのですか?ネット上でカレーする例がたくさんあります。あなたは関数を返す... – epascarello

+1

@epascarello申し訳ありませんが私はそれを明確にしていない場合。私はこのhttp://www.crockford.com/javascript/www_svendtofte_com/code/curried_javascript/index.htmlとこのhttp://blog.carbonfive.com/2015/01/14/gettin-freaky-functional -wcurried-javascript /私の試みについては、彼らは非常に離れているので、私はそれらを掲示する際に価値を見ません。また、私はカレーリング自体に問題はありません。私は最終的に解決する前に、関数の呼び出しの可変数を取るに問題があります。それにどう対応するのか分かりません。 – m0meni

+0

Btwでは、variadic関数を使用する代わりに、reduce演算子関数とbinary演算子関数、またはvariadic引数が配列として渡される "semi-variadic"関数で対応する問題を解決する必要があります。これは、機能的なスタイルにはるかによく合います。バリアント関数は、解決するよりも多くの問題を作り出し、避けるべきです。 – rand

答えて

2

不可能ではありませんが、valueOf()を使用してください。

function add(initNum) { 
 
    var sum = initNum; 
 
    var callback = function (num) { 
 
     sum += num; 
 
     return callback; 
 
    }; 
 
    callback.valueOf = function() { 
 
     return sum; 
 
    }; 
 
    return callback; 
 
}; 
 
console.log(add(1)(2)==3);   //true 
 
console.log(add(1)(1)+1);    //3 
 
console.log(add(1)(2)(3).valueOf()); //6

+0

ああ、これは、 '=='があなたに必要な答えを与え、 '==='は答えない場合の1つです。 – m0meni

+1

はい引数の送信を終了するために特別な外部呼び出しを追加することなく*不可能です*。あるいは、もっと明確に言うと、元の質問のAPIは不可能です。 – naomik

+1

@naomikメソッドを完全に終了したり、カリングに必要な繰り返し回数を記述したりする必要があります。 valueOfを使用すると、内部的に呼び出すものはすべて、開発者が手動でチェーンを停止する必要なく、値を取得します。 – epascarello

4

未知数の引数を持つバリアント関数をカレーすることは不可能です。カリー化関数は、最後の引数が受信されるまで、その時点で、関数を返していきますので、addは可変引数関数である、あなたは

var add5 = curryN(add, 5); 
add5(1)(2)(3)(4)(5); //=> 15 

var add3 = curryN(add, 3); 
add3(1)(2)(3); //=> 6 

ような何かを行うことができ、このカントーを避けていないが、単純にあります

計算が実行されます。


他の唯一のオプションは、引数を「短絡」する方法を作成し、引数が送信されたことを関数に通知することです。それはundefinedは可変長引数の終わりを、ここで

var xadd = curryUntilUndefined(add); 
xadd(1)(2)(3)(4)(5)(undefined); //=> 15 

のようなものが必要になります。私は本当にあなたのために作成することができます他の問題のため、このthoをお勧めしません。特にそれを見てうれしいわけではありません。

+0

私も同じことを考えていましたが、それは私自身の知識不足によるものであると希望していました。私は誰かが奇跡的な解決策を持っているかどうかを待つつもりですが、そうでなければあなただけを受け入れます。 – m0meni

+1

@ AR7興味があれば、私は[カレー化機能に関する別の答え](http://stackoverflow.com/a/30249365/633183)を読んだことがあります。 – naomik

+0

あなたはあなたの答えにjavascriptの奇妙さを考慮しなかったようです。 Epascarelloはそれを得た。 – m0meni

関連する問題