Clojure 有 "unfold" 吗?
Does Clojure have "unfold"?
(defn unfold [step seed]
(if-let [[val new-seed] (step seed)]
(cons val (lazy-seq (unfold step new-seed)))
nil))
用法示例:
(defn fib-step [[x y]] [x [y (+ x y)]])
(take 10 (unfold fib-step [0 1])) ;=> (0 1 1 2 3 5 8 13 21 34)
(defn decreasing [x] (if (neg? x) nil [x (dec x)]))
(unfold decreasing 5) ;=> (5 4 3 2 1 0)
clojure 标准(或常用)库中是否存在这个或类似的东西?如果不是,有什么原因吗?我找到的最接近的是这个博客 post:
http://www.matlux.net/blog/2014/05/04/anamorphic-adventure-in-clojure
不,unfold
未在 Clojure 中实现。它由 amalloys flatland.useful 库提供,根据 CrossClj,该库具有广泛的用途。鉴于您链接的博客 post 对这个主题进行了相当深入的探讨,我怀疑您的问题中包含的内容比直接回答所能满足的要多...您是否有一些设想 iterate
不足?或者对 iterate
在名称或行为上并不完全 unfold
感到失望?
(defn fib-step [[a b]] [b (+ a b)])
(take 10 (map first (iterate fib-step [0 1])))
(take-while (complement neg?) (iterate dec 5))
对于这些示例,我更喜欢使用 iterate
,因为 iterate
已经是核心的一部分。我可以看到人们更喜欢 unfold
如果他们更熟悉的话。
有许多提供 "things that should have been in core" 的库,例如 https://weavejester.github.io/medley/medley.core.html. A quick search on https://crossclj.info/ reveals https://github.com/amalloy/useful 包含 flatland.useful.seq/unfold,虽然我没有使用过,但看起来是一个很好的实现Clojure 核心贡献者并附带一些其他很酷的东西。
(defn unfold [step seed]
(if-let [[val new-seed] (step seed)]
(cons val (lazy-seq (unfold step new-seed)))
nil))
用法示例:
(defn fib-step [[x y]] [x [y (+ x y)]])
(take 10 (unfold fib-step [0 1])) ;=> (0 1 1 2 3 5 8 13 21 34)
(defn decreasing [x] (if (neg? x) nil [x (dec x)]))
(unfold decreasing 5) ;=> (5 4 3 2 1 0)
clojure 标准(或常用)库中是否存在这个或类似的东西?如果不是,有什么原因吗?我找到的最接近的是这个博客 post:
http://www.matlux.net/blog/2014/05/04/anamorphic-adventure-in-clojure
不,unfold
未在 Clojure 中实现。它由 amalloys flatland.useful 库提供,根据 CrossClj,该库具有广泛的用途。鉴于您链接的博客 post 对这个主题进行了相当深入的探讨,我怀疑您的问题中包含的内容比直接回答所能满足的要多...您是否有一些设想 iterate
不足?或者对 iterate
在名称或行为上并不完全 unfold
感到失望?
(defn fib-step [[a b]] [b (+ a b)])
(take 10 (map first (iterate fib-step [0 1])))
(take-while (complement neg?) (iterate dec 5))
对于这些示例,我更喜欢使用 iterate
,因为 iterate
已经是核心的一部分。我可以看到人们更喜欢 unfold
如果他们更熟悉的话。
有许多提供 "things that should have been in core" 的库,例如 https://weavejester.github.io/medley/medley.core.html. A quick search on https://crossclj.info/ reveals https://github.com/amalloy/useful 包含 flatland.useful.seq/unfold,虽然我没有使用过,但看起来是一个很好的实现Clojure 核心贡献者并附带一些其他很酷的东西。