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 に答える