Функциональная обработка потоков Scala без ошибок OutOfMemory

Можно ли применить функциональное программирование к потокам Scala таким образом, чтобы поток обрабатывался последовательно, но уже обработанная часть потока могла быть собрана мусором?

Например, я определяю Поток , содержащий числа от start до end :

def fromToStream(start: Int, end: Int) : Stream[Int] = {
  if (end < start) Stream.empty
  else start #:: fromToStream(start+1, end)
}

Если я суммирую значения в функциональном стиле:

println(fromToStream(1,10000000).reduceLeft(_+_))

Я получаю OutOfMemoryError - возможно, потому, что стековый кадр вызова reduceLeft содержит ссылку на заголовок потока. Но если я сделаю это в итеративном стиле, это сработает:

var sum = 0
for (i <- fromToStream(1,10000000)) {
  sum += i
}

Есть ли способ сделать это в функциональном стиле без получения OutOfMemory ?

ОБНОВЛЕНИЕ : Это было ошибка в scala , которая исправлена. Так что сейчас это более или менее устарело.

20
задан Lii 7 August 2016 в 09:40
поделиться