Las preguntas son:
- ¿Los generadores rompen el paradigma de programación funcional? ¿Por qué o por qué no?
- En caso afirmativo, ¿pueden usarse los generadores en la programación funcional y cómo?
Considera lo siguiente:
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
El método downCounter
aparece sin estado. Además, llamar a downCounter
con la misma entrada, siempre dará como resultado la misma salida. Sin embargo, al mismo tiempo, llamar a next()
no produce resultados consistentes.
No estoy seguro de si los generadores rompen el paradigma de programación funcional porque en este ejemplo counter
es un objeto generador y, por lo tanto, llamar a next()
produciría los mismos resultados que otro objeto generador creado exactamente con el mismo maxValue
.
Además, llamar a someCollection[3]
en una matriz siempre devolverá el cuarto elemento. De manera similar, llamar a next()
cuatro veces en un objeto generador también siempre devolverá el cuarto elemento.
Para más contexto, estas preguntas surgieron mientras trabajaban en un programación de kata . La persona que respondió a la pregunta, planteó la cuestión de si los generadores podrían usarse o no en la programación funcional y si se mantienen o no en estado.