Мне кажется совершенно естественным, что генераторы, которые очень похожи на массивы, должны поддерживать самые основные операции с списком, такие как map()
, filter()
и reduce()
. Я что-то упускаю?Почему генераторы не поддерживают map()?
Я написал код для map
и кажется достаточно простым, но было бы гораздо лучше иметь все функции, встроенные во всех генераторах:
let fancyGen = g => {
let rv = function*() {
for (let x of g)
yield x;
}
rv.map = function*(p) {
for (let x of g)
yield p(x);
}
return rv;
}
Я новичок в генераторах, поэтому любые комментарии по коду приветствуются. В частности, это лучший способ написать «генератор идентичности»?
Отличительные генераторы от итераторов - это как различие пуделей от собак - пудели * - это собаки, хотя не все собаки пудели. В обратном случае кейн-итераторы, которые не являются генераторами, неудобны и трудны в работе, поэтому я ограничиваю свои интересы генераторами (и обращается к синтаксису 'for..of'). – Malvolio
Мне кажется, что 'reduce()' не должно быть функцией генератора. – Malvolio
@ Malvolio: На самом деле генераторы гораздо более капризны и трудны в работе, чем обычные итераторы. Вы довольно редко сталкиваетесь с ними - все методы '[Symbol.iterator]' возвращают итераторы, а не генераторы. Доступ к генераторам через 'for of' не использует их полную мощность. – Bergi