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で定義。