2017-05-21 5 views
4

mapコレクションをリストにすることなく可能ですか?私はベクトルについてはmapvを知っていますが、セットやマップはどうですか? map関数は、各コレクションをファンクタ(つまり、何かマッピング可能なもの)として扱い、マッピング後にその型を保持しますか?ここでリストをリストにしないでコレクションをマップする

は私が今起こっていただきまし対心を持っているものです。

(map inc [1 2 3])   ; => [2 3 4], instead I get: (2 3 4) 
(map inC#{1 2 3})  ; => #{3 2 4}, instead I get: (3 2 4) 
(map inc {:a 1 :b 2 :c 3} ; => {:a 2 :b 3 :c 4}, instead I get: ClassCastException 

答えて

9

あなたの関数からの戻り値が正確にリストされない、それが印刷されたとき、彼らはREPLで表現されているか、単にです。あなたがここに見ることができるように彼らは、本当にclojure.lang.LazySeqのインスタンスである:むしろmappableというより

(class (map inc [1 2 3])) 
=> clojure.lang.LazySeq 

を、Clojureのは、Sequableとしてすべてのコレクションに対処しようとします。 Seq抽象化では、多くの変換をコレクションの操作のパイプラインにまとめて行うことができます。特に元の入力タイプを維持することは、パフォーマンス(スピード)の点では意味がありません。この場合、Clojureの動的性質は実際には非常に有用です。

それはあなたがしたいコレクション型への操作の出力を変換するために些細です:intoを使用して、

(-> (map inc [1 2 3]) 
    (vec)) 

または単に以上:

(into [] (map inc [1 2 3])) 

intoをリスト、マップに使用することができ、セット:

(into #{} (map inC#{1 2 3})) 
=> #{4 3 2} 

mapclojure.lang.MapEntryという形式のキーと値のペアのシーケンスが渡されるため、数字が必要なincは直接操作できません。

あなたがキーと値を引き出すために非構造を使用して、このような何かを行うことができます:

(into {} (for [[k v] {:a 1 :b 2 :c 3}] 
      [k (inc v)])) 
+3

共通のイディオム:(....)が空XS(に) '' ' – ClojureMostly

+1

(空XS)'イディオムはまた、メタデータおよび他の保存しますコレクションプロパティ(ソート関数など) – Aisamu

0

into機能は、特定のタイプに任意の順序になります。 、元の型を保つ最初の引数として(empty data)を渡す:

(def data #{1 2 3}) 
(into (empty data) (map inc data)) 
;; #{4 3 2} 
関連する問題