首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure中的一级序列展平函数是什么?

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

Stack Overflow用户
提问于 2012-05-23 23:43:08
回答 3查看 9.9K关注 0票数 39

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-24 17:46:51

我一般的首选是apply concat。此外,不要忽视(for [subcoll coll, item subcoll] item) --根据更广泛的上下文,这可能会导致代码更清晰。

票数 24
EN

Stack Overflow用户

发布于 2012-05-24 10:54:14

没有标准的函数。在许多情况下,apply concat是一个很好的解决方案。或者,您可以等效地使用mapcat seq

apply concat的问题是,当集合/序列不在第一级时,它会失败:

代码语言:javascript
复制
(apply concat [1 [2 3] [4 [5]]])
=> IllegalArgumentException Don't know how to create ISeq from: java.lang.Long...

因此,您可能希望执行以下操作:

代码语言:javascript
复制
(defn flatten-one-level [coll]  
  (mapcat  #(if (sequential? %) % [%]) coll))

(flatten-one-level [1 [2 3] [4 [5]]])
=> (1 2 3 4 [5])

作为更一般的观点,缺少内置函数通常不应阻止您定义自己的函数:-)

票数 20
EN

Stack Overflow用户

发布于 2012-05-23 23:48:01

我也使用apply concat --我不认为核心中还有其他东西。

flatten是多层的(并且是通过树遍历定义的,而不是重复的单层扩展)

另请参阅Clojure: Semi-Flattening a nested Sequence,它有一个来自clojure mvcflatten-1 (它比我预期的要复杂得多)。

更新以澄清懒惰:

代码语言:javascript
复制
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末尾的注释

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10723451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档