我想通過向每個值應用來自另一個地圖的函數來轉換clojure hashmap的方法。這是我到目前爲止有:在clojure中使用函數映射來轉換地圖
(defn transform-map [m fm]
(into {} (for [[k v] m]
(let [mfn (get fm k identity)] [k (mfn v)])))
(def m {:a 0 :b 0 :c 0 :d 0})
(def fm {:a inc :b dec :c identity})
(transform-map m fm) ;=> {:a 1, :b -1, :c 0, :d 0}
這是正常工作,但只有這樣,只要每個函數只有一個參數是關鍵的當前值。如果我想在我的函數圖中使用除了同一個鍵以外的值的函數呢?例如,假設我想將密鑰:a
和:b
的總和放入密鑰:d
?
我可以嘗試類似:
(assoc fm :d (fn[a b] (+ a b)))
,但有什麼辦法,我可以改變我的transform-map
功能,所以它會在該函數調用中使用適當的參數?
我喜歡這種方法,@Ankur。但是,IMO的一個缺點是,由於你在'fm'上映射''map',所以你不能自動通過'm'中沒有'fm'中鍵的鍵到輸出。這很容易通過在缺失的鍵中「合併」來糾正。謝謝! – stand 2013-03-26 18:18:53
是的,在上面的實現中,'轉換'決定了輸出映射鍵。 – Ankur 2013-03-27 06:25:39
嘿@Ankur,很好的回答!但是難道你不能用(map(partial get m)(rest v))來替換(應用juxt(rest v))m)嗎?或者,由於內置的地圖實現也可以調用,所以可以進一步簡化事物 - (map m(rest v))。你使用juxt有什麼特別的原因嗎? – 2013-03-30 04:14:24