, Почему потоковая операция сгиба бросает Из исключения памяти?

я имею после простого кода

 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 без побочных эффектов.

6
задан yura 5 September 2011 в 18:25
поделиться