使用重叠段多次聚合 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 秒就返回了。
如何使以下函数尾递归并完全流式传输?
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 秒就返回了。