Clojure めも2
書き直した。
(def pie-a {:a 10 :b 20 :c 30 :d 40}) (def pie-b {:a 1, :b 2, :c 3 :d 4}) (def pie-c {:b 200, :c 300}) (def pie-d {:a 1000, :b 2000, :c 3000 :d 4000}) (merge-with + pie-a pie-b pie-c) (merge-with - pie-d pie-a pie-b) (defn protated [amount-to-prorate pie] (let [total (reduce + (vals pie)) calc (fn [v] (/ (* v amount-to-prorate) total))] (apply merge (for [[k v] pie] {k (calc v)})))) (protated 1000 pie-a) (defn protated-merge [amount-to-prorate pie] (merge-with + pie (protated amount-to-prorate pie))) (protated-merge 1000 pie-a) ; #=> {:a 110, :b 220, :c 330, :d 440}
(reduce + (map (fn [k] (second k)) pie))
よくよく考えると
(reduce + (map second pie))
で、いいやと気づいた。本を読んでいると、valsがあるのを知って
(reduce + (vals pie)
に書き換え。
(apply merge (for [[k v] pie] {k (calc v)}))
mapのかわりに、リスト内包表記で書き直してみた。計算自体は、あらかじめlet側に calcで定義。