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
?
返回一个惰性序列,该序列由将f应用于0的结果组成 和coll的第一项,然后将f应用于1和第二项 coll中的项目等,直到coll耗尽。因此函数f应该 接受2个参数,index和item。返回有状态的传感器 没有提供任何收集。 - 我的重点
好吧,我也只提供了一个论证,即4Clojure问题的集合。我不确定这是如何起作用的......是否存在某种隐含或隐含的论点?
感谢任何帮助清理这个!
答案 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])