【发布时间】:2015-05-20 16:26:18
【问题描述】:
如何使以下函数尾递归并完全流式传输?
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... 的流。但这会在大输入时破坏堆栈。如何优化此功能?
【问题讨论】:
标签: scala stream aggregation