Питання:
- Чи порушують генератори парадигму функціонального програмування? Чому або чому ні?
- Якщо так, то чи можна використовувати генератори у функціональному програмуванні?
Розглянемо наступне:
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]
масиву завжди повертав би четвертий елемент. Аналогічно, виклик next()
чотирьох разів на об'єкт генератора також завжди повертав би четвертий елемент.
Для більш широкого контексту ці питання виникали під час роботи над програмою ката . Людина, яка відповіла на питання, поставила питання про те, чи можна використовувати генератори у функціональному програмуванні і чи є вони чи ні.