做的时候
(map f [0 1 2] [:0 :1])
Run Code Online (Sandbox Code Playgroud)
f 将被调用两次,参数为
是否有一种简单而有效的方法,即不产生更多的中间序列等,以便f使用以下参数为第一个集合的每个值调用?
在评论中编辑 @ fl00r的地址问题.
(count first-coll)无论第二个(或第三个或......)集合是否更长,触发此问题的实际用例都需要map始终正好工作.
现在游戏有点晚了,在接受了答案之后有些不公平,但是如果添加一个好的答案,只做了我特别要求的 - 映射(count first-coll)时间 - 我会接受.
你可以这样做:
(map f [0 1 2] (concat [:0 :1] (repeat nil)))
Run Code Online (Sandbox Code Playgroud)
基本上,用无限的nils序列填充第二个coll.map到达第一个集合的末尾时停止.
一个(急切的)循环/重复形式,走向最长的一端:
(loop [c1 [0 1 2] c2 [:0 :1] o []]
(if (or (seq c1) (seq c2))
(recur (rest c1) (rest c2) (conj o (f (first c1) (first c2))))
o))
Run Code Online (Sandbox Code Playgroud)
或者你可以写一个懒惰的地图版本做类似的事情.