Clojure中的一级序列展平函数是什么?我现在使用的是apply concat,但我想知道在标准库或clojure-contrib中是否有内置的函数。
发布于 2012-05-24 17:46:51
我一般的首选是apply concat。此外,不要忽视(for [subcoll coll, item subcoll] item) --根据更广泛的上下文,这可能会导致代码更清晰。
发布于 2012-05-24 10:54:14
没有标准的函数。在许多情况下,apply concat是一个很好的解决方案。或者,您可以等效地使用mapcat seq。
apply concat的问题是,当集合/序列不在第一级时,它会失败:
(apply concat [1 [2 3] [4 [5]]])
=> IllegalArgumentException Don't know how to create ISeq from: java.lang.Long...因此,您可能希望执行以下操作:
(defn flatten-one-level [coll]
(mapcat #(if (sequential? %) % [%]) coll))
(flatten-one-level [1 [2 3] [4 [5]]])
=> (1 2 3 4 [5])作为更一般的观点,缺少内置函数通常不应阻止您定义自己的函数:-)
发布于 2012-05-23 23:48:01
我也使用apply concat --我不认为核心中还有其他东西。
flatten是多层的(并且是通过树遍历定义的,而不是重复的单层扩展)
另请参阅Clojure: Semi-Flattening a nested Sequence,它有一个来自clojure mvc的flatten-1 (它比我预期的要复杂得多)。
更新以澄清懒惰:
user=> (take 3 (apply concat (for [i (range 1e6)] (do (print i) [i]))))
012345678910111213141516171819202122232425262728293031(0 1 2)你可以看到它对参数求值32次-这是为了提高效率而分块的,否则就是惰性的(它不会计算整个列表)。有关分块的讨论,请参阅http://isti.bitbucket.org/2012/04/01/pipes-clojure-choco-1.html末尾的注释
https://stackoverflow.com/questions/10723451
复制相似问题