As perguntas são:
- Os geradores quebram o paradigma de programação funcional? Por que ou por que não?
- Se sim, os geradores podem ser usados na programação funcional e como?
Considere o seguinte:
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
O downCounter
método parece sem estado. Além disso, chamar downCounter
com a mesma entrada sempre resultará na mesma saída. No entanto, ao mesmo tempo, a chamada next()
não produz resultados consistentes.
Não tenho certeza se os geradores quebram ou não o paradigma de programação funcional, porque neste exemplo counter
é um objeto gerador e, portanto, a chamada next()
produziria os mesmos resultados que outro objeto gerador criado exatamente com o mesmo maxValue
.
Além disso, chamar someCollection[3]
uma matriz sempre retornaria o quarto elemento. Da mesma forma, chamar next()
quatro vezes em um objeto gerador também sempre retornaria o quarto elemento.
Para mais contexto, essas questões foram levantadas durante o trabalho em um kata de programação . A pessoa que respondeu à pergunta levantou a questão de saber se os geradores poderiam ou não ser usados na programação funcional e se eles mantêm ou não o estado.