2014-10-17 101 views
2

我對Clojure中的以下代碼感到困惑。代碼起作用。不過,我不明白的是,匿名函數中,當我們通過在參數[new-map [key val]],我們明確地告訴Clojure的期望在矢量形式的[key val]解構它但我們傳遞一個參數hash{:max 30 :min 10}。我根本沒有意義。爲什麼在幫助減少地圖時減少助手解構矢量?

如果我們要傳遞一個散列到函數中,參數是不是應該是[new-map {:key val}]?有人可以向我解釋我的邏輯出錯了嗎?

(reduce (fn [new-map [key val]] 
      (assoc new-map key (inc val))) 
     {} 
     {:max 30 :min 10}) 

回答

4
user=> (type [:plum 8]) 
clojure.lang.PersistentVector 
user=> (def mymap {:apple 1 :banana 2 :orange 10 :plum 8}) 
#'user/mymap 
user=> (type mymap) 
clojure.lang.PersistentHashMap 
user=> (first mymap) 
[:plum 8] 
user=> (type (first mymap)) 
clojure.lang.MapEntry 

In the docs,大約中途上下頁:

映射條目被視爲關鍵和值的有序集合。

MapEntry延伸AMapEntry,其延伸​​,其也由PersistentVector(一個你所熟悉的)擴展。

短版本是,您可以遍歷地圖的條目,並且地圖中的每個條目都像一個矢量,具有以下結構:[key value]

2

{:key1 :val1, :key2 :val2}當作爲序列遍歷變成'([:key1 :val1] [:key2 :val2])(儘管不一定按該順序)。這裏,reduce正是以這種方式遍歷它,並將每一對單獨傳遞給reducer函數。