1. ホーム
  2. clojure

[解決済み] Clojureでは、リストタイプを変換する簡単な方法はありますか?

2023-02-05 06:58:08

質問

私はしばしば、ベクトルが必要なときに遅延リストを使用していることに気づきますし、その逆もあります。また、時々、私は本当にマップのセットを望んでいたのに、マップのベクトルを持つことがあります。これらのタイプの間で変換するのに役立つヘルパー関数はありますか?

どのように解決するのですか?

忘れてはならないのが、あの信頼できる古い into を使えば、どんなものでも seq と、満たして欲しい空のコンテナを受け取り、それを into に置く。

(into [] '(1 2 3 4)) ==> [1 2 3 4]         "have a lazy list and want a vector"
(into #{} [1 2 3 4]) ==> #{1 2 3 4}        "have a vector and want a set"
(into {} #{[1 2] [3 4]}) ==> {3 4, 1 2}    "have a set of vectors want a map"
(into #{} [{1 2} {3 4}]) ==> #{{1 2} {3 4}} "have a vector of maps want a set of maps"

intoconj のラッパーです。これは、コレクションの型に基づいて新しいエントリを適切に挿入するための基本的な抽象化です。このフローがとてもうまくいく原理は、Clojureが コンポーザブルな抽象化 であり、この場合 into の上に conj の上に、コレクションと seq .

上記の例は、受信者が実行時に渡される場合でもうまく構成されます。なぜなら、基礎となる抽象的なもの ( seqconj はすべてのコレクション(そしてJavaのコレクションの多くも)に対して実装されているので、より高い抽象化は多くの特別なデータ関連のコーナーケースを心配する必要はありません。