我是Clojure Programming的新手。已经玩了一个星期了。我读了“Clojure Programming”这本书,经过一遍又一遍的阅读,尝试在REPL中剖析这个函数,但不知道这个函数究竟是如何工作的:
(defn reduce-by [key-fn f init coll]
(reduce (fn [summaries x]
(let [k (key-fn x)]
(assoc summaries k (f (summaries k init) x))))
{} coll))
我仍然无法理解assoc
部分:
(assoc summaries k (f (summaries k init) x))))
特别是在(summaries k init)
。它看起来不像函数,因为summaries
被定义为地图。
该功能旨在按如下方式使用
(def orders
[{:product "Clock", :customer "Wile Coyote", :qty 6, :total 300}
{:product "Dynamite", :customer "Wile Coyote", :qty 20, :total 5000}
{:product "Shotgun", :customer "Elmer Fudd", :qty 2, :total 800}
{:product "Shells", :customer "Elmer Fudd", :qty 4, :total 100}
{:product "Hole", :customer "Wile Coyote", :qty 1, :total 1000}
{:product "Anvil", :customer "Elmer Fudd", :qty 2, :total 300}
{:product "Anvil", :customer "Wile Coyote", :qty 6, :total 900}])
(reduce-by :customer #(+ %1 (:total %2)) 0 orders)
它将产生如下所示的序列
;= {"Elmer Fudd" 1200, "Wile Coyote" 7200}
我很感激任何可以向我解释的人。
由于
答案 0 :(得分:0)
好吧,看起来我想通了。
由于地图也是功能,如果地图(summaries k init)
不包含密钥init
,summaries
将返回k
的值。
愚蠢的我撇去并忘了。