使(映射f c1 c2)映射(计数c1)次,即使c2具有较少的元素

Eug*_*sky 2 clojure

做的时候

(map f [0 1 2] [:0 :1])
Run Code Online (Sandbox Code Playgroud)

f 将被调用两次,参数为

  • 0:0
  • 1:1

是否有一种简单而有效的方法,即不产生更多的中间序列等,以便f使用以下参数为第一个集合的每个值调用?

  • 0:0
  • 1:1
  • 2零

在评论中编辑 @ fl00r的地址问题.

(count first-coll)无论第二个(或第三个或......)集合是否更长,触发此问题的实际用例都需要map始终正好工作.

现在游戏有点晚了,在接受了答案之后有些不公平,但是如果添加一个好的答案,只做了我特别要求的 - 映射(count first-coll)时间 - 我会接受.

Ale*_*ler 5

你可以这样做:

(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)

或者你可以写一个懒惰的地图版本做类似的事情.