在 clojure 中使函数惰性化

Making a function lazy in clojure

我有这个功能,它似乎在有限的 collections 上工作正常,但在无限的 collections 上却不行。有没有一种方法可以在其中构造一个 lazy-seq 来获得它 运行 无限的 coll,例如:(take 3 (m inc (range))) => (1 2 3)?

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

这似乎是 map

的一个用例
(map f c)

或(当它必须是向量时)

(mapv f c)

编辑: 地图的可能重新实现:

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

reduce 将继续从序列中获取元素,直到 nil 得到 returned。因此,reduce 永远不会 return 在无限序列上。

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