3

そのような地図があるとします

{:a 1 :b 2 :c 3}

私はこれを次のようにマッピングしたいと思います (注 - 非動作疑似コード):

(mapcat (fn [[:key key-a][:value value-a]] (println "key: " key-a "\n value: " value-a )))

最初に関数のキーを取得し、それらをマッピングして関数から読み戻さなくても、これは可能ですか?

私の質問は、Clojure のキーを知らずにマップをキーと値のペアに分解するにはどうすればよいですか?

4

2 に答える 2

6
(seq {:a 1 :b 2 :c 3})
;([:a 1] [:b 2] [:c 3])

マップを呼び出すseqと、キーと値のペアのシーケンスが得られます。通常、seq呼び出しは暗黙的です。

ペア

  • 入力した順序である必要はありません。
  • は実際にはMapEntrys であり、ペアとして動作します。

したがって

(type (first {:a 1 :b 2 :c 3}))
;clojure.lang.MapEntry

あなたの疑似コード

(mapcat (fn [[:key key-a][:value value-a]] (println "key: " key-a "\n value: " value-a )))

...いくつかの修理が必要です:

  • 省略された最後の引数map (適用されるコレクション) を指定します。
  • MapEntryそれぞれをペアとして単純に分解して、
    キーと値を取得します。
  • 関数を各ペアに適用するmap代わりに使用します。mapcatまったく機能するのは幸運ですmapcat
  • dorunシーケンスを強制的に評価し、その際に破棄するために使用します。REPL は前者を実行しますが、実行中のアプリケーションは必要ありません。

これにより、

(dorun
 (map 
  (fn [[key-a value-a]] (println "key: " key-a " value: " value-a ))
  {:a 1 :b 2 :c 3}))

どのプリント

key:  :a  value:  1
key:  :c  value:  3
key:  :b  value:  2

...そして戻ります nil

于 2015-02-09T11:53:31.820 に答える