减少和减少让你积累一个序列的状态。 序列中的每个元素将修改累计状态,直到达到序列末尾的 。Clojure:减少,减少和无限列表
对无限列表调用reduce或reduce会有什么影响?
(def c (cycle [0]))
(reduce + c)
这将很快抛出OutOfMemoryError。顺便说一句,(reduce + (cycle [0]))
不会抛出一个OutOfMemoryError(至少不是我等待的时间)。它永远不会返回。不知道为什么。
有什么办法以有意义的方式调用无限列表上的减少或减少?我在上面的例子中看到的问题是,最终列表的评估部分变得足够大以至于堆溢出。也许无限的列表不是正确的范例。减少发生器,IO流或事件流将更有意义。评估并用于修改状态后,该值不应保留。
感谢。说得通。在第一种情况下,我可以调用第一个c,并且将评估无限列表中的第一个元素,它将保留在内存中。如果我第一次调用足够的次数,无限列表的评估部分将变得太大,堆将溢出。在第二种情况下,评估部分不断丢弃。顺便说一句,在第二种情况下,堆不会溢出,因为零的总和仍然为零。 – yalis 2011-03-08 03:37:24
零点上的好点。想要提及的clojure 1.2和1.3在这方面是不同的,我猜它是错误的:) – 2011-03-08 04:35:39