Clojure有"展开"吗?

Dan*_*ton 5 clojure lazy-sequences unfold

(defn unfold [step seed]
  (if-let [[val new-seed] (step seed)]
    (cons val (lazy-seq (unfold step new-seed)))
    nil))
Run Code Online (Sandbox Code Playgroud)

用法示例:

(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)
Run Code Online (Sandbox Code Playgroud)

这个或类似的东西是否存在于clojure标准(或常用)库中?如果没有,是否有原因?我发现的最接近的是这篇博文:

http://www.matlux.net/blog/2014/05/04/anamorphic-adventure-in-clojure

Tim*_*ley 5

不,unfold在Clojure中未实现。它由amalloys flatland.useful库提供,根据CrossClj的介绍,它具有广泛的用途。看到您链接的博客文章提供了对该主题的相当深入的探索,我怀疑您的问题比直接回答还不能满足您的需求...您是否想到了一些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))
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用iterate这些示例,因为iterate它已经是核心。我可以看到人们更喜欢unfold他们是否更熟悉。

有许多库提供“本应存在于内核中的内容”,例如https://weavejester.github.io/medley/medley.core.html。在https://crossclj.info/上进行的快速搜索显示https://github.com/amalloy/useful包含flatland.useful.seq / unfold,尽管我没有使用过,但它似乎是Clojure核心贡献者的出色实现并附带其他一些不错的东西来启动。