Clojure隐式映射解释



我理解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,因此它将每个集合的相应元素传递给*函数。

最新更新