使用重叠段多次聚合Scala Stream

时间:2015-03-18 01:29:26

标签: scala stream aggregation

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

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...的流。但这会在大输入上打破堆栈。如何优化此功能?

1 个答案:

答案 0 :(得分:2)

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

事实上,我以100万美元的价格运行它并且它返回< 1秒。