在Clojure中,map-indexed中的第二个参数

时间:2015-10-29 03:56:48

标签: clojure

SPOILER ALERT:这是关于4Clojure question 157索引序列的答案。

此问题的快速版本:在(map-indexed #(vector %2 %1) [:a :b :c])中,%2是什么?

  

索引序列#157

     

将序列转换为包含原始元素及其索引的对序列。

(= (__ [:a :b :c]) [[:a 0] [:b 1] [:c 2]])
(= (__ [0 1 3]) '((0 0) (1 1) (3 2)))
(= (__ [[:foo] {:bar :baz}]) [[[:foo] 0] [{:bar :baz} 1]])

我很快就找到了答案:#(map reverse (map-indexed vector %)),但看到了看似更好的答案,例如:

map-indexed #(vector %2 %1)

由用户 tomdmitriev

问题:第二个参数来自哪里?

那么,对于(map-indexed #(vector %2 %1) [:a :b :c]),什么是%2

docs for map-indexed州:

  

返回一个惰性序列,该序列由将f应用于0的结果组成   和coll的第一项,然后将f应用于1和第二项   coll中的项目等,直到coll耗尽。因此函数f应该   接受2个参数,index和item。返回有状态的传感器   没有提供任何收集。 - 我的重点

好吧,我也只提供了一个论证,即4Clojure问题的集合。我不确定这是如何起作用的......是否存在某种隐含或隐含的论点?

感谢任何帮助清理这个!

1 个答案:

答案 0 :(得分:1)

传递给map-indexed的函数是[index item]的函数。易于理解:

 (map-indexed (fn [idx itm] [idx itm]) "item")
 ; ([0 "item"])

实际上是 apply_map_with_index

回到你的例子,用:

 (map-indexed #(vector %2 %1) [:a :b :c])
 ; ([:a 0] [:b 1] [:c 2])

将创建一个小序列的向量,由%2项构成,%1为索引。

您还可以将上述内容与易于理解的内容进行比较:

 (map-indexed #(vector %1 %2) [:a :b :c])
 ; ([0 :a] [1 :b] [2 :c])

创建[index item]的小向量序列。

编辑:

如果我们分两步分解它,它会给出:

  ; we need to define a function 
  ; with two parameters 
  (defn my-function [index item]
      (vector item index))

  ; map-indexed uses a function with 
  ; two parameters
  (map-indexed 
       my-function 
       [:a :b :c])