2014-07-10 78 views
0

我瞭解地圖的作品,但我通過這個例子困惑:Clojure的隱含地圖解釋

(def check-sum 
    (fn [sequence] 
     (apply + (map * 
        (range 1 (inc (count sequence))) 
        sequence)))) 

給定的順序時,地圖部分看起來是這樣的:

(map * (range 1 (inc (count [5 1 1 4 7 7 1 3 1 0]))) [5 1 1 4 7 7 1 3 1 0]) 

它返回這樣的:

(5 2 3 16 35 42 7 24 9 0) 

我不明白地圖中當前項目在哪裏相乘。我會理解它是否使用#(* %)等形式的匿名函數。

但是在這個例子中沒有匿名函數。

回答

2

map的第一個參數應該是函數,參數的數量應該與提供的集合數相匹配。所以,如果你想傳遞一個匿名函數,你應該寫這樣的代碼:

(map #(* %1 %2) [1 3 5] [2 4 6]) 
;=> (2 12 30) 
(map #(* %1 %2 %3) [1 3 5] [2 4 6] [3 5 7]) 
;=> (6 60 210) 

*本身可以採取任何數量的參數(檢查從REPL (doc *))的功能,你可以寫代碼以更簡單的形式:

(map * [1 3 5] [2 4 6]) 
;=> (2 12 30) 
(map * [1 3 5] [2 4 6] [3 5 7]) 
;=> (6 60 210) 

*被施加到組中的每個集合中,設置第二元件中的第一元件,...

其它功能等+-/也可以這樣使用。

0

不需要匿名函數,因爲命名函數*是什麼在做乘法。兩個集合被傳遞給map,所以它將每個集合的相應元素傳遞給*函數。