![]() |
1
13
是的,你可以。诀窍是使用尾部递归方法,以便本地堆栈帧只包含对
此外,必须确保传递给方法的内容
总结:
编辑: 请注意,这同样有效,不会导致内存不足错误:
编辑2:
对于reduceCleft,需要一个accumulator参数,可以使用默认参数将其设置为某个值。一个简单的例子:
|
![]() |
2
19
当我开始了解
万一你真的需要
如果你试试上面的那一行,它会很好地收集垃圾。我发现使用流是很难的,因为它很容易抓住头部而不意识到它。有时标准库会以非常微妙的方式为您保留它。 |
![]() |
3
2
你可能想看看斯卡拉兹的 ephemeral streams . |
![]() |
4
2
事实证明,这是 a bug 在目前实施的裁员。问题是ReduceCeleft调用foldLeft,因此ReduceCeleft的stackFrame在整个调用过程中保持对流头的引用。foldleft使用tail递归来避免这个问题。比较:
它们在语义上是等价的。在scala版本2.8.0中,对foldLeft的调用可以工作,但是对reduceCleft的调用抛出了一个内存不足的地方。如果减速器能自己工作,这个问题就不会发生。 |
![]() |
Kon · OCaml中的模块类型语义 6 月前 |
![]() |
user20102550 · 如何在解析器中使用输入字符串 12 月前 |
![]() |
tijko · 处理整数数组时出现意外结果 1 年前 |
![]() |
David542 · 按列分区,按另一列排序 1 年前 |
|
Arnett Rufino · `max的输出是多少` 1 年前 |
![]() |
Adrian · 变量捕获:变量在函数闭包中的行为 1 年前 |