这个clojure表达式是做什么的(摘自O&"x27;Reilly的书)

这个clojure表达式是做什么的(摘自O&"x27;Reilly的书),clojure,maps,Clojure,Maps,我是Clojure编程新手。我已经玩了一个星期了。我阅读了《Clojure编程》一书,在反复阅读之后,我试图在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))

我是Clojure编程新手。我已经玩了一个星期了。我阅读了《Clojure编程》一书,在反复阅读之后,我试图在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))))
尤其是在
(总结k init)
中。它看起来不像一个函数,因为
摘要
被定义为一个映射

该功能的用途如下所示

(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)
它将产生如下所示的seq

;= {"Elmer Fudd" 1200, "Wile Coyote" 7200}
我感谢任何能向我解释的人


谢谢

好的,看来我已经明白了

因为映射也是函数,
(summaries k init)
将返回
init
的值,如果映射
summaries
不包含键
k


如果你自己找到了答案,就把你自己的答案标记为已接受。请不要在题目后面加上“封闭”这个词。谢谢多米尼克,但上面说我明天只能接受我自己的答案。