使用重叠段多次聚合 Scala Stream

Aggregate Scala Stream multiple times with overlapping segments

如何使以下函数尾递归并完全流式传输?

def aggregate[A, B](in: Stream[A], predicate: Stream[A] => B): Stream[B] = {
    in match {
        case Empty => Stream.empty
        case head #:: Empty => predicate(in) #:: Stream.empty
        case head #:: tail => predicate(in) #:: aggregate(tail, predicate)
    }
}

目标处理带有前瞻性的流。例如,假设我们有一个序列号流:val s: Stream[Int] = Stream.from(0)。现在我想计算从每个元素开始的这个流的 5 个顺序元素的总和。使用上面的函数,它看起来像这样:val r: Stream[Int] = aggregate(s, _.take(5).sum),生成 10, 15, 20... 的流。但这会破坏大量输入的堆栈。如何优化此功能?

你为什么说这会在更大的输入时破坏堆栈?你试过这个吗?请参考 this SO question,其中 Ken Bloom 指出流不需要尾递归。

事实上,我 运行 花了 1,000,000 次,结果不到 1 秒就返回了。