在Clojure中如何使列表“不懒惰”

8

我最近注意到这里有一个非常清晰的插入排序实现:

Insertion sort in clojure throws StackOverFlow error

  • 该实现会由于concat函数懒加载连接列表而导致内存溢出。 我想知道:

我们可以采用什么策略来“去惰性”列表从而在大型集合上获得更好的性能?


嗯... 经过更多的谷歌搜索,很明显,回答这个问题的简单方法是使用“doall”函数来包装集合。然而,我认为这里可能会有一些需要了解的陷阱。 - jayunit100
1个回答

6

doall可以很好地强制执行惰性求值。

还有一件有用的事情需要记住,那就是reduce是非惰性的。因此,在大型计算中,它非常有用,可以确保在计算继续进行之前对中间结果进行求值和归约为单个输出值。


我不太理解为什么会被踩。doall可以完成任务,而将其累积到向量中的reduce也提供了一种解决方案,不应该立即被忽略。结果具有快速随机访问的特性,这对于某些应用程序可能很有趣。(话虽如此:在生成的序列周围放置一个vec也会得到相同的结果。) - kotarak
我同意做所有的工作...事实上,它确实有效。我在发布这个问题后立即尝试了一下,关于其他参考帖子。请发表评论。 - jayunit100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接