clojure隐式映射解释

时间:2014-07-10 05:42:01

标签: 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 个答案:

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