我理解地图是如何工作的,但我对这个例子感到困惑:
(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)
我不明白地图中当前项目的乘法位置。我会理解它是否使用了#(* %)
等形式的匿名函数。
但是这个例子中没有匿名函数。
答案 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)
*
适用于每个集合的第一个元素集,第二个元素集,......
+
,-
,/
等其他功能也可以这种方式使用。
答案 1 :(得分:0)
不需要匿名函数,因为命名函数*
正在进行乘法运算。两个集合传递给map,因此它将每个集合中的相应元素传递给*
函数。