我理解map是如何工作的,但是我对这个例子感到困惑:
(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)
我不明白地图中的当前项目在哪里被相乘。如果它使用的是#(* %)
等形式的匿名函数,我会理解的。
但是这个例子中没有匿名函数
map
的第一个参数应该是function,参数的个数应该与所提供的集合的个数相匹配。所以,如果你想传递一个匿名函数,你应该这样写代码:
(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)
*
应用于每个集合的第一个元素的集合,第二个元素的集合,…
其他函数如+
、-
、/
也可以这样使用
不需要匿名函数,因为做乘法的是命名函数*
。将两个集合传递给map,因此它将每个集合的相应元素传递给*
函数。