如何使以下函数尾递归并完全流式传输?
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...
的流。但这会在大输入上打破堆栈。如何优化此功能?
答案 0 :(得分:2)
为什么你说这会在更大的输入上打破堆栈?你试过这个吗?请参考this SO question,其中Ken Bloom指出流不需要尾递归。
事实上,我以100万美元的价格运行它并且它返回< 1秒。