我试图想出一种通过将另一个映射中的函数应用于每个值来转换 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}
Run Code Online (Sandbox Code Playgroud)
这很好用,但前提是每个函数都采用一个参数,即键的当前值。如果我想在函数映射中放置一个使用除同一键中的值以外的值的函数该怎么办?:a例如,假设我想将键和的总和放入:bkey 中:d?
我可以尝试这样的事情:
(assoc fm :d (fn[a b] (+ a b)))
Run Code Online (Sandbox Code Playgroud)
但是有没有办法可以改变我的transform-map函数,以便它在该函数调用中使用适当的参数?
我建议分解这些功能以及它们如何在转换图中应用。下面是一个例子来说明:
;; functions which take some params and return a result
(defn sub [a b] (- a b))
(defn add [a b] (+ a b))
;; data map
(def data {:a 5 :b 4 :c 3})
;; transformation map key => output key, value is vector of function
;; to apply and the params that function will take from the data map
(def transformations {:a [inc :a]
:b [dec :b]
:c [add :a :b]
:d [sub :b :c]})
; The transformation function
(defn transform-map [m fm]
(into {} (map (fn [[k v]]
[k (apply (first v)
((apply juxt (rest v)) m))])
fm)))
(transform-map data transformations)
Run Code Online (Sandbox Code Playgroud)