質問は次のとおりです。
- ジェネレーターは関数型プログラミングのパラダイムを壊しますか?なぜですか?
- はいの場合、ジェネレーターを関数型プログラミングで使用できますか?
以下を考慮してください。
function * downCounter(maxValue) {
yield maxValue;
yield * downCounter(maxValue > 0 ? maxValue - 1 : 0);
}
let counter = downCounter(26);
counter.next().value; // 26
counter.next().value; // 25
// ...etc
downCounter
この方法は、ステートレス表示されます。同様に、downCounter
同じ入力で呼び出すと、常に同じ出力になります。ただし、同時に、呼び出しnext()
は一貫した結果を生成しません。
この例でcounter
はジェネレーターオブジェクトであるため、ジェネレーターが関数型プログラミングパラダイムを破るかどうかはわかりません。そのため、呼び出しnext()
はまったく同じで作成された別のジェネレーターオブジェクトと同じ結果を生成しますmaxValue
。
同様someCollection[3]
に、配列を呼び出すと、常に4番目の要素が返されます。同様next()
に、ジェネレーターオブジェクトで4回呼び出すと、常に4番目の要素が返されます。
より多くのコンテキストについては、これらの質問は、プログラミングカタの作業中に提起されました。質問に答えた人は、関数型プログラミングでジェネレーターを使用できるかどうか、およびジェネレーターが状態を保持するかどうかという質問を提起しました。