2014-07-10 42 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,所以它将每个集合的相应元素传递给*函数。