gpt4 book ai didi

在 trait 中定义的 Scala 尾递归流处理器函数保存对流头的引用

转载 作者:行者123 更新时间:2023-12-04 01:57:22 24 4
gpt4 key购买 nike

在以下情况下

trait T {

@tailrec
def consume[A](as: Stream[A]): Unit = {
if (as.isEmpty) ()
else consume(as.tail)
}
}

object O extends T

调用 O.consume(Range(1, N).toStream)N足够大,程序将耗尽内存,或者至少将消耗 O(N) 而不是所需的 O(1)。

最佳答案

为特征生成尾递归方法。 trait 扩展器中的方法条目(这里是 O)将调用转发到 trait 的方法,但在这样做的同时,它保留了对 Stream 头部的引用。

因此该方法是尾递归的,但仍然无法释放内存。补救措施:不要在 trait 中定义 Stream 函数,直接在对象中定义。

另一种选择是 scalaz 的 EphemeralStream ,它持有对流头和尾的弱引用,并根据需要重新计算它们。

关于在 trait 中定义的 Scala 尾递归流处理器函数保存对流头的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12486762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com