Clojure,将多个序列连成一个

o'a*_*uer 5 clojure

以下行: (repeat 4 [2 3])

给我这个: ([2 3] [2 3] [2 3] [2 3])

如何从上面的向量列表创建一个向量或列表,以便我得到这个?: [2 3 2 3 2 3 2 3]

谢谢

noi*_*ith 18

concat 实际上正是你想要的功能

user> (apply concat (repeat 4 [2 3]))
(2 3 2 3 2 3 2 3)
Run Code Online (Sandbox Code Playgroud)

这甚至适用于懒惰输入:

user> (take 8 (apply concat (repeat [2 3])))
(2 3 2 3 2 3 2 3)
Run Code Online (Sandbox Code Playgroud)

这是一个替代方案:

user> (def flatten-1 (partial mapcat identity))
#'user/flatten-1
user> (flatten-1 (repeat 4 [2 3]))
(2 3 2 3 2 3 2 3)
Run Code Online (Sandbox Code Playgroud)

它与懒惰兼容,不像flatten保留任何子结构(只做一个平坦的水平)

user> (take 12 (flatten-1 (repeat [2 3 [4]])))
(2 3 [4] 2 3 [4] 2 3 [4] 2 3 [4])
Run Code Online (Sandbox Code Playgroud)


Leo*_*hin 6

(take 8 (cycle [2 3]))
;; => (2 3 2 3 2 3 2 3)
Run Code Online (Sandbox Code Playgroud)


小智 2

(展平 x)
获取顺序事物(列表、向量等)的任何嵌套组合,并将其内容作为单个平面序列返回。
(展平零)返回零。

(flatten (repeat 4 [2 3]))  ;(2 3 2 3 2 3 2 3)
Run Code Online (Sandbox Code Playgroud)

  • 展平的问题是它通常过于激进,一旦您希望保留序列中任何位置的任何子序列,它就不再有用。通常使用 flatten 表明您应该以不同的方式生成数据(即用 mapcat 代替 map,用 cons 代替 list)。 (4认同)