2017-12-19 15 views
1

ちょうど、なぜinitialValueがreduce()のような関数型プログラミングメソッドに与えられているのだろうか?このようにした理由は何ですか?なぜInitialValueにreduce()か同様に与えるのですか?

関数の最後に与えるのではなく、同じように動作するので、配列の最初の要素として持つこともできます。 今は機能プログラミングを学ぼうとしていますが、この点は意味をなさないものです。

+0

もし私が3つのクマ( '[5、42、69]')の年齢を 'reduce'関数で合計したいのであれば、初期値を与えずにどうすればいいですか? –

+0

私はそれが「還元」にのみ与えられていると思います。このパラメータをとる他の "関数型プログラミングメソッド"は何を知っていますか? – Bergi

+0

@OliverCharlesworth、配列の3つの年齢を合計しています。あなたはすでに5 [0]の初期値を持っています。なぜあなたは別の初期値が必要なのでしょうか? – Tiyor

答えて

0

配列が空でinitialValueが指定されていない場合は、TypeErrorがスローされます。

MDN web docs

+0

私たちはどちらもこのことを理解していないように見えます。 :)これは私の質問の答えではありません – Tiyor

3

同じに動作として、同じ意味し、配列の最初の要素としてそれを有することも可能です。

reduce汎用の関数であり、配列の最初の要素として期待値を持つものだけでなく、任意の配列で動作するはずです。最も重要なケースは空の配列です。

はい、初期値を配列の最初の要素としてプッシュし、次にreduceを初期値なしで呼び出し、配列から再度削除しても同じ結果が得られます。しかし、これは扱いにくく、常に機能するとは限りません(例えば、不変配列)。また、アキュムレータは配列要素と同じ型を持たないかもしれません。

ただreduceの実装、およびそれが抽象的と思われるパターンを考える:パラメータが賢明な選択をするよう

function reduce(callback, iterable) { 
    let val = ???; 
    for (const element of iterable) 
     val = callback(val, element); 
    return val; 
} 

???を取ります。

1

この主な理由は、ゼロ長のデータ構造を正しく処理する必要があるためです。

乗算の場合、1を選択します。加算するには0です。データ型によっては、空の文字列、単位行列などがあります。これらはバイナリ操作のあるalgebraic structuresのゼロ(または単位)です。

この構成では、例外が少なくなります。類推のために、なぜ符号付き整数を使用する必要がありますか? 5 - 7オペレーションが発生したときに例外なく、より自然に減算を表現できるようにそこにあります。

関数型プログラミングのほとんどは、数学的(代数)構造に深く根ざしています。これらの知識は、美しく包括的なソリューションを見つけるのを助け、単純化します。

また、この質問と回答は、Difference between fold and reduce?です。

関連する問題