这个clojure表达式是做什么的(摘自O&"x27;Reilly的书)
我是Clojure编程新手。我已经玩了一个星期了。我阅读了《Clojure编程》一书,在反复阅读之后,我试图在REPL中剖析这个函数,但不知道这个函数是如何工作的:这个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))
(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
如果你自己找到了答案,就把你自己的答案标记为已接受。请不要在题目后面加上“封闭”这个词。谢谢多米尼克,但上面说我明天只能接受我自己的答案。