Akım sıralı olarak işlenecek şekilde, Scala akışlarına işlevsel programlama uygulamak mümkün mü, ancak akışın zaten işlenmiş kısmı çöp toplanabilir mi?OutOfMemory hataları olmadan Scala akışlarının işlevsel işlenmesi
Mesela ben end
için start
numaraları içeren bir Stream
tanımlayın:
def fromToStream(start: Int, end: Int) : Stream[Int] = {
if (end < start) Stream.empty
else start #:: fromToStream(start+1, end)
}
Ben işlevsel bir tarzda değerleri Özetle edin:
println(fromToStream(1,10000000).reduceLeft(_+_))
alıyorum bir
OutOfMemoryError
- Belki de
reduceLeft
numaralı aramanın stackframe'i, akışın başına bir referansa sahip olduğundan. Ben iteratif bir tarzda bunu Ama eğer çalışır: Bir
OutOfMemory
almadan fonksiyonel bir tarzda bunu yapmanın bir yolu
var sum = 0
for (i <- fromToStream(1,10000000)) {
sum += i
}
var mı?
UPDATE: Bu, şu anda giderilen a bug in scala idi. Yani bu şimdi daha az veya çok güncel.
Bu hiçbir şekilde sorunuzu yanıtlamıyor olsa da, akışların sözdizimi '# ::' aktaranının Stream.cons ' –