2015-08-26 6 views
1

Скажем, у меня есть карта:Clojure применить функцию преобразования для значений отображения

{: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)} 

но он чувствует себя очень повторы.

Я чувствую, что функция уменьшения может здесь хорошо выглядеть, но я не знаю, как это сделать.

ответ

2

Выполнение 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} 

Edit:algo.generic.fmap выглядит, как он будет работать.

Редактировать бис Благодарности к @Andre за упоминание о том, что map-vals функция существует в обоих weavejester/medley или prismatic/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)))) 
+2

Просто FYI: Много много людей используют (или создать) функцию «map-vals». Например, «weavejester/medley» или «призматический/сантехнический» оба имеют эти преимущества при использовании переходных процессов. – ClojureMostly

+0

@Andre Спасибо, если вы хотите поместить это как ответ (со ссылками/кодом, например https://github.com/weavejester/medley/blob/master/src/medley/core.cljc#L60), я бы hapilly принимаем. Я также нашел https://clojure.github.io/algo.generic/clojure.algo.generic.functor-api.html#clojure.algo.generic.functor/fmap – nha

+1

Ваш ответ прекрасен, просто добавьте примеры, если вы хотеть. – ClojureMostly