Мне нужен удобный способ для генерации Iterable
, учитывая исходный объект и функцию для создания следующего объекта из текущего, который потребляет O (1) памяти (т. Е. Он не кэширует старые результаты;если вы хотите выполнить итерацию во второй раз, функция должна быть применена снова).
Не похоже, что для этого есть поддержка библиотек.В Scala 2.8 метод scala.collection.Iterable.iterate
имеет сигнатуру
def iterate [A] (start: A, len: Int)(f: (A) ⇒ A) : Iterable[A]
, поэтому он требует, чтобы вы заранее определили, сколько приложений с итерационными функциями вам интересно, и мое понимание документации таково, что Iterable.iterate
фактически вычисляет все эти значения немедленно.С другой стороны, метод scala.collection.Iterator.iterate
имеет сигнатуру
def iterate [T] (start: T)(f: (T) ⇒ T) : Iterator[T]
, которая выглядит великолепно, но мы получаем только Iterator
, который не предлагает все удобства map
, filter
идрузья.
Есть ли удобный метод библиотеки для производства того, что я хочу?
, а если нет,
Может кто-нибудь предложить для этого «разговорный» код Scala?
Подводя итог, учитывая начальный объект a: A
и функцию f: A => A
, я быкак TraversableLike
(например, вероятно Iterable
), который генерирует a, f(a), f(f(a)), ...
и использует O (1) память, с функциями map
, filter
и т. д., которые также возвращают что-то, что O (1) впамять.