在 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
,谢谢!
我有这个功能,它似乎在有限的 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
,谢谢!