я имею после простого кода
def fib(i:Long,j:Long):Stream[Long] = i #:: fib(j, i+j)
(0l /: fib(1,1).take(10000000)) (_+_)
, И он выдает исключение OutOfMemmoryError. Я не могу понять, почему, потому что я думаю, все части используют постоянную память т.е. потоки отложенных вычислений и foldLeft...
Они кодируют, также не работают
fib(1,1).take(10000000).sum or max, min e.t.c.
, Как правильно реализовать бесконечные потоки и сделать повторяющиеся операции на него?
версия Scala: 2.9.0
Также scala javadoc сказал, что foldLeft операция является памятью, безопасной для потоков
/** Stream specialization of foldLeft which allows GC to collect
* along the way.
*/
@tailrec
override final def foldLeft[B](z: B)(op: (B, A) => B): B = {
if (this.isEmpty) z
else tail.foldLeft(op(z, head))(op)
}
РЕДАКТИРОВАНИЕ:
Реализация с итераторами, все еще полезными, так как это бросает $ {доменное имя} исключение
def fib(i:Long,j:Long): Iterator[Long] = Iterator(i) ++ fib(j, i + j)
, Как определить правильно бесконечный поток/итератор в Scala?
EDIT2: Я не забочусь о международном переполнении, я просто хочу понять, как создать бесконечный поток/итератор и т.д. в scala без побочных эффектов.