Le domande sono:
- I generatori rompono il paradigma della programmazione funzionale? Perché o perché no?
- Se sì, i generatori possono essere utilizzati nella programmazione funzionale e in che modo?
Considera quanto segue:
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
Il metodo downCounter
appare stateless. Inoltre, chiamando downCounter
con lo stesso input, otterrai sempre lo stesso risultato. Tuttavia, allo stesso tempo, chiamare next()
non produce risultati coerenti.
Non sono sicuro che i generatori interrompano il paradigma della programmazione funzionale perché in questo esempio counter
è un oggetto generatore e quindi chiamare next()
produrrebbe gli stessi risultati di un altro oggetto generatore creato con lo stesso esatto maxValue
.
Inoltre, chiamare someCollection[3]
su un array restituirebbe sempre il quarto elemento. Analogamente, chiamare next()
quattro volte su un oggetto generatore restituirà sempre anche il quarto elemento.
Per più contesto, queste domande sono state sollevate mentre si lavorava su programmazione kata . La persona che ha risposto alla domanda ha sollevato la questione se i generatori possano o meno essere utilizzati nella programmazione funzionale e se mantengano o meno lo stato.