Pytania są następujące:
- Czy generatory łamią paradygmat programowania funkcjonalnego? Dlaczego lub dlaczego nie?
- Jeśli tak, czy generatory mogą być używane w programowaniu funkcjonalnym i jak?
Rozważ następujące:
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
Metodą wydaje bezstanowy. Również wywoływanie downCounter
z tym samym wejściem zawsze będzie skutkować tym samym wyjściem. Jednocześnie jednak wywoływanie next()
nie daje spójnych wyników.
Nie jestem pewien, czy generatory łamią paradygmat programowania funkcjonalnego, ponieważ w tym przykładzie counter
jest obiektem generatora, a więc wywołanie next()
dałoby takie same wyniki jak inny obiekt generatora utworzony z dokładnie takim samym maxValue
.
Również wywołanie someCollection[3]
tablicy zawsze zwróci czwarty element. Podobnie, next()
czterokrotne wywołanie obiektu generatora zawsze zwróci czwarty element.
Dla większego kontekstu pytania te zostały podniesione podczas pracy nad kata programistycznym . Osoba, która odpowiedziała na pytanie, zadała pytanie, czy generatory mogą być używane w programowaniu funkcjonalnym i czy posiadają stan.