什么';Clojure中的一级序列展平函数是什么?

什么';Clojure中的一级序列展平函数是什么?,clojure,functional-programming,Clojure,Functional Programming,Clojure中的一级序列展平功能是什么?我现在正在使用apply-concat,但我想知道在标准库或clojure-contrib中是否有用于此的内置函数。我也使用apply-concat——我认为核心中没有其他功能 展平是多个级别(通过树漫游定义,而不是重复的单级别扩展) 另请参见其中的flatte-1from(比我预期的要复杂得多) 更新以澄清懒惰: user=> (take 3 (apply concat (for [i (range 1e6)] (do (print i) [i]

Clojure中的一级序列展平功能是什么?我现在正在使用
apply-concat
,但我想知道在标准库或clojure-contrib中是否有用于此的内置函数。

我也使用
apply-concat
——我认为核心中没有其他功能

展平
是多个级别(通过树漫游定义,而不是重复的单级别扩展)

另请参见其中的
flatte-1
from(比我预期的要复杂得多)

更新以澄清懒惰:

user=> (take 3 (apply concat (for [i (range 1e6)] (do (print i) [i]))))
012345678910111213141516171819202122232425262728293031(0 1 2)

您可以看到,它对参数求值32次-这是为了提高效率而进行的分块,并且在其他方面是懒惰的(它不会对整个列表求值)。有关分块的讨论,请参见《没有标准函数》结尾处的注释<代码>应用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])

更一般地说,缺少内置函数通常不会阻止您定义自己的:-)

我的首选是
apply-concat
。另外,不要忽略
(对于[subcoll coll,item subcoll]item)
——根据更广泛的上下文,这可能会导致代码更清晰。

也许这是我在回答中给出的链接的重复?如果没有人很快发现更好的结果,将投票关闭。我收集的可能副本
apply
应该很少使用吗?这种用法合理吗?它不是比必要的慢吗?我认为说它应该很少使用的唯一原因是,如果存在一个单一的替代方案,那么它应该被使用。至于速度,我不知道,但不要期望它特别慢。绝对不是应用程序很少使用的情况。想用就用;随便把它撒在你的意大利面上。序列是惰性的,包括函数arg序列,因此
(apply(fn[&args](first args))(range 1e5))
仍然非常快,只需向函数传递指向列表开头的指针
concat
有一个类似的“形状”,所以它同样便宜。值得一提的是,apply实现了至少4个元素,即使没有分块。谢谢你的回答。我想要
apply-concat
给出的行为。好吧,我认为
mapcat-identity
是我所需要的。谢谢你的回答!mapcat实现为apply-concat,它通过将参数作为序列处理而变得懒惰。