1

采用一个函数,该函数输入一个集合、集合集合、集合、嵌套向量,其中包含集合等。因此,输入有时不是同一类型。如何将这样的输入转换为嵌套向量结构?在第一种情况下,我会使用

(into [] #{1 2 3 4})

将转换为向量。但是在集合中的集合的情况下,我无法输出嵌套向量,即

#{1 2 3 #{1 2 3}}

同样,我可能有一个输入,例如

[1 2 3 (4 5 6)]

我想输出

[1 2 3 [4 5 6]]

这个想法是,有时我需要深入并挑选出一个集合或集合以变成一个向量。是否有可能拥有一个函数,它通常可以处理许多不同的结构输入并输出嵌套向量结构。即一个函数可以概括上述例子吗?我稍微简化了样本,例如我可能有输入,例如

[[[1 2 3 4] [#{1 2 3 4} 2 3 4] [(1 2 3 4) 2 3 4]]]

为了更深入地了解我正在尝试处理的函数,请考虑语言 R 中的函数 C。此函数的重要性在于向量结构在统计/数据分析中的重要性。

4

2 回答 2

1

一个幼稚的 reduce 实现:

(defn to-vectors [c]
  (reduce #(conj %1 (if (coll? %2) (to-vectors %2) %2))
          [] c))

user=> (to-vectors '[[[1 2 3 4] [#{1 2 3 4} 2 3 4] [(1 2 3 4) 2 3 4]]])  
[[[1 2 3 4] [[1 2 3 4] 2 3 4] [[1 2 3 4] 2 3 4]]]
于 2014-02-01T02:21:13.410 回答
1
user=> (use 'clojure.walk)
user=> (clojure.walk/postwalk (fn [e] (if (coll? e) (vec e) e)) '(1 2 3 #{4 5 6 (7 8 9)}))
[1 2 3 [4 5 6 [7 8 9]]]
于 2014-01-31T20:20:21.110 回答