【问题标题】:Aggregate Scala Stream multiple times with overlapping segments使用重叠段多次聚合 Scala Stream
【发布时间】: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


    【解决方案1】:

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

    事实上,我以 1,000,000 次运行它,它在

    【讨论】:

    • 对,你是对的,我必须承认我没有在大量输入上尝试这段代码,因为我 100% 确定它会破坏堆栈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 2019-02-04
    • 2016-04-04
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多