gpt4 book ai didi

Clojure:减少,减少和无限列表

转载 作者:行者123 更新时间:2023-12-03 23:12:52 26 4
gpt4 key购买 nike

减少和减少让您在序列上累积状态。
序列中的每个元素都会修改累积的状态,直到
到达序列的末尾。

在无限列表上调用reduce 或reductions 有什么含义?

(def c (cycle [0]))
(reduce + c)

这将很快抛出 OutOfMemoryError。顺便说一句, (reduce + (cycle [0]))不会抛出 OutOfMemoryError (至少在我等待的时候不会)。它永远不会回来。不知道为什么。

有没有办法以有意义的方式在无限列表上调用reduce或reductions?我在上面的例子中看到的问题是,最终列表的评估部分变得足够大以溢出堆。也许无限列表不是正确的范例。减少生成器、IO 流或事件流会更有意义。该值在评估并用于修改状态后不应保留。

最佳答案

它永远不会返回,因为reduce 接受一个序列和一个函数并应用该函数直到输入序列为空,只有这样它才能知道它具有最终值。

减少真正无限的 seq 没有​​多大意义,除非它产生副作用,例如记录其进度。

在您的第一个示例中,您首先创建一个引用无限序列的 var。

(def c (cycle [0]))

然后您将 var c 的内容传递给 reduce,它开始读取元素以更新其状态。
(reduce + c)

这些元素不能被垃圾回收,因为 var c 持有对其中第一个的引用,而后者又持有对第二个的引用,依此类推。最终它读取的数量与堆中的空间一样多,然后是 OOM。

为了避免在第二个示例中炸毁堆,您没有保留对已经使用过的数据的引用,因此循环返回的 seq 上的项目在生成时会以 GCd 的速度运行,并且累积的结果会继续变大。最终它会溢出 long 并崩溃(clojure 1.3)或将自己提升为 BigInteger 并增长到所有堆的大小(clojure 1.2)
(reduce + (cycle [0]))

关于Clojure:减少,减少和无限列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5227503/

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