在clojure中使函数变得懒惰

时间:2015-10-08 18:49:42

标签: clojure lazy-sequences

我有这个功能似乎在有限的集合上工作正常,但在无限集合上却没有。有没有办法在其中构建lazy-seq以使其与无限的coll一起运行,例如:(take 3 (m inc (range))) => (1 2 3)

(defn m [f c] (reduce #(conj % (f %2)) [] c))

2 个答案:

答案 0 :(得分:2)

这似乎是map

的用例
(map f c)

或(当它必须是向量时)

(mapv f c)

修改 可能会重新实现map:

(defn new-map [f coll]
  (if (seq coll)
    (lazy-seq
      (cons (f (first coll)) 
            (new-map f (rest coll))))))

答案 1 :(得分:1)

reduce将继续从序列中获取元素,直到返回nil为止。因此,reduce永远不会返回无限序列。

正如评论中所指出的,reduced可用于强制终止reduce,谢谢!