10

select-keysに似たものを探しています:

(desired-fn {:a 1, :b 2, :c 3, :d 4} [:a :d])
;= [1 4]

;; N.B. the order of the keys in the argument seq is preserved
(= (desired-fn (array-map :a 1, :b 2, :c 3, :d 4)
               [:b :c])
   (desired-fn (array-map :d 4, :c 3, :a 1, :b 2)
               [:b :c]))
;= true

実装するのは特に難しいことではありませんが、まだ適切な名前を思い付いていません。

(defn select-values-corresponding-to-keys [m ks]
  (for [k ks]
    (get m k)))

このニーズを正確に満たす標準関数を知らないのでしょうか? そうでない場合、他の言語 (Python、Ruby、Haskell など) にはこの関数の名前がありますか?

4

5 に答える 5

3

キーワードはそれ自体が関数 (実装IFn) であり、マップを調べて値を返すことができるため、1 つのオプションとして を使用しますjuxt

(def keys-to-vals (juxt :b :c))
(= (keys-to-vals {:a 1, :b 2, :c 3, :d 4})
   (keys-to-vals {:d 4, :c 3, :a 1, :b 2}))

したがって、基本的に、目的の fn は次のようになります。

(defn select-vals [map keys] ((apply juxt keys) map))
于 2013-05-29T04:27:20.937 に答える
3

mapあなたが探している機能です:

(map {:a 1 :b 2 :c 3} [:a :c])
=> (1 3)

これが機能するのは、ハッシュマップ自体が、指定さclojure.lang.IFnれた任意のキーの値を返す関数 (つまり、 implements ) として機能するためです。

于 2013-05-29T07:09:41.060 に答える
1

Jay Fields は、洞察力に富んだブログ投稿 @ http://blog.jayfields.com/2011/01/clojure-select-keys-select-values-and.htmlで、この関数と他のいくつかの関連関数について説明しています。

(ほんの数分前に「select-keys」を検索したときに偶然見つけました。)

どこかに「正規の」実装があるかどうかを知りたいので、質問は未解決のままにしています。

于 2013-05-28T22:15:51.213 に答える