【问题标题】:Clojure apply transform function to values of a mapClojure 将变换函数应用于地图的值
【发布时间】:2015-11-20 07:47:10
【问题描述】:

假设我有一张地图:

 {:top 2.8421709430404007E-14, :left 0, :down 240, :right 400N}

如何迭代它以将所有内容转换为整数?

 {:top 0, :left 0, :down 240, :right 400}

一个明显的解决方案是:

 {:top (:top m), :left (:left m), :down (:down m), :right (:right m)}

但感觉非常重复。

我觉得减少功能在这里可以做得很好,但我不确定如何。

【问题讨论】:

    标签: dictionary clojure hashmap reducers


    【解决方案1】:

    对条目执行map 可能是另一种方式:

    (into {} (map (fn [[k v]] [k (int v)]) m))
    ;; {:top 0, :left 0, :down 240, :right 400}
    

    【讨论】:

      【解决方案2】:

      我不得不使用reduce-kv:

      (reduce-kv #(assoc %1 %2 (int %3)) {} {:top 2.8421709430404007E-14, :left 0, :down 240, :right 400N})
      ;;=>{:down 240, :left 0, :right 400, :top 0}
      

      编辑:algo.generic.fmap 看起来也可以。

      编辑之二: 感谢@Andre 提到map-vals 函数存在于weavejester/medleyprismatic/plumbing 中。

      来自medley

      (defn map-vals
        "Maps a function over the values of an associative collection."
        [f coll]
        (reduce-map (fn [xf] (fn [m k v] (xf m k (f v)))) coll))
      

      来自plumbing

      (defn map-vals
        "Build map k -> (f v) for [k v] in map, preserving the initial type"
        [f m]
        (cond
         (sorted? m)
         (reduce-kv (fn [out-m k v] (assoc out-m k (f v))) (sorted-map) m)
         (map? m)
         (persistent! (reduce-kv (fn [out-m k v] (assoc! out-m k (f v))) (transient {}) m))
         :else
         (for-map [[k v] m] k (f v))))
      

      【讨论】:

      • 仅供参考:许多人使用(或创建)map-vals 函数。例如,weavejester/medleyprismatic/plumbing 都具有这些特性,并在使用瞬态时具有一些性能优势。
      • @Andre 谢谢,如果你想把它作为答案(使用链接/代码,如 github.com/weavejester/medley/blob/master/src/medley/… )我很乐意接受。我还找到了clojure.github.io/algo.generic/…
      • 你的答案很好,如果你想添加例子就行了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2014-06-01
      • 2018-12-19
      相关资源
      最近更新 更多