gpt4 book ai didi

Clojure:为什么会出现 StackOverflowError?

转载 作者:行者123 更新时间:2023-12-03 00:24:45 28 4
gpt4 key购买 nike

(reduce concat (repeat 10000 []))

我知道展平可能是执行此操作的更好方法,但我仍然很好奇为什么这会导致错误。

最佳答案

因为concat产生一个惰性序列。

所以,当你打电话时

(concat a b)

除非您尝试使用结果,否则不会进行实际的串联。

因此,您的代码创建了 10000 个嵌套惰性序列,导致 StackOverflow 错误。

我可以看到两种方法来防止它抛出错误。

第一种方法是使用 doall function 强制 concat 执行:

(reduce (comp doall concat) (repeat 10000 []))

第二种方法是使用贪婪 into function而不是懒惰的concat:

(reduce into (repeat 10000 []))

更新

至于您关于使用展平的建议,这不是一个好的解决方案,因为展平是递归的,所以它也会尝试展平所有嵌套集合。考虑以下示例:

(flatten (repeat 3 [[1]]))

它将生成扁平序列 (1 1 1),而不是串联的一个 ([1] [1] [1])

我认为最好的解决方案是将 concatapply 一起使用:

(apply concat (repeat 10000 []))

因为它将产生单个惰性序列而不会引发 StackOverflow 错误。

关于Clojure:为什么会出现 StackOverflowError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22993906/

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