【问题标题】:Does Clojure have "unfold"?Clojure 有“展开”吗?
【发布时间】:2023-03-17 04:24:01
【问题描述】:
(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 标准(或常用)库中是否存在此或类似内容?如果没有,有什么原因吗?我找到的最接近的是这篇博文:

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

【问题讨论】:

    标签: clojure lazy-sequences unfold


    【解决方案1】:

    不,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))
    

    我更喜欢在这些示例中使用iterate,因为iterate 已经是核心的一部分。我可以看到人们更喜欢unfold,如果他们更熟悉的话。

    有许多库提供“应该在核心中的东西”,例如https://weavejester.github.io/medley/medley.core.html。快速搜索 https://crossclj.info/ 发现 https://github.com/amalloy/useful 包含 flatland.useful.seq/unfold,虽然我没有使用过,但它看起来是 Clojure 核心贡献者的一个很好的实现,并附带了一些其他很酷的东西。

    【讨论】:

    • 我忘记了是什么促使我提出这个问题,但我只是想更好地了解如何为此类任务编写惯用的 clojure。我认为您的回答很好地提供了我正在寻找的信息。
    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多