gpt4 book ai didi

recursion - 在 Clojure 喜结连理 : circular references without (explicit, 丑陋)突变?

转载 作者:行者123 更新时间:2023-12-03 07:00:38 24 4
gpt4 key购买 nike

在我的回答中Clojure For Comprehension example我有一个处理自己输出的函数:

(defn stream [seed]
(defn helper [slow]
(concat (map #(str (first slow) %) seed) (lazy-seq (helper (rest slow)))))
(declare delayed)
(let [slow (cons "" (lazy-seq delayed))]
(def delayed (helper slow))
delayed))

(take 25 (stream ["a" "b" "c"]))
("a" "b" "c" "aa" "ab" "ac" "ba" "bb" "bc" "ca" "cb" "cc" "aaa" "aab" "aac"
"aba" "abb" "abc" "aca" "acb" "acc" "baa" "bab" "bac" "bba")

它的工作原理是创建一个前向引用(延迟),该引用用作惰性序列(慢速)中的第二个条目。该序列被传递给惰性函数,然后使用该函数的输出(惰性序列的第一部分,不需要计算延迟)来设置延迟的值。

就这样我“喜结良缘”了。但这在 Haskell 中做得更加优雅(例如 Explanation of “tying the knot” )。鉴于 Clojure 有 delayforce,我想知道是否有更好的方法来完成上述操作?

那么问题是:在上面的代码中能否以某种方式避免(延迟)的(丑陋的、显式的)突变?显然(?)你仍然需要突变,但它可以被“惰性”结构隐藏吗?

[昨晚当我仍在试图了解如何做到这一点时,我有一个类似标题的问题;在上面的代码起作用之前没有人回复,所以我删除了它,但我对这种方法不太满意,所以我再试一次。]

另请参阅:Must Clojure circular data structures involve constructs like ref? (人们重复问题有点令人沮丧)。

最佳答案

我不确定我可以回答一般情况的问题,但这个函数似乎可以解决特殊情况。

(defn stream
[seed]
(let [step (fn [prev] (for [p prev s seed] (str p s)))]
(for [x (iterate step seed) y x] y)))

尽管我遇到了一个大型 (dorun (take ...)) 的内存不足异常。所以这个功能可能有问题。

关于recursion - 在 Clojure 喜结连理 : circular references without (explicit, 丑陋)突变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11567625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com