Можно ли применить функциональное программирование к потокам Scala, так что поток обрабатывается последовательно, но уже обработанная часть потока может быть собрана мусором?
Например, я определяю Stream
, который содержит числа от 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
?
UPDATE. Это была ошибка в scala, которая исправлена. Так что теперь это более или менее устарело.