Можно ли применить функциональное программирование к потокам 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 , которая исправлена. Так что сейчас это более или менее устарело.