gpt4 book ai didi

clojure - 为什么具有副作用的 Clojure xform 的行为不符合预期?

转载 作者:行者123 更新时间:2023-12-02 10:02:17 24 4
gpt4 key购买 nike

我发现向 Clojure 传感器添加副作用可能会导致以下意外行为:

(def counter (atom 0))

(def increment-counter-xform
(map (fn [sample]
(swap! counter inc)
sample)))

(eduction increment-counter-xform (range 100))
@counter ;; => 100, as expected

(reset! counter 0)
(eduction increment-counter-xform (range 1000))
@counter ;; => 129, but I expected 1000

为什么上述代码块对于少量样本会按预期次数递增计数器,但对于大量样本却不会?看起来,即使 range 的参数非常大,计数器的增量也永远不会超过 129 次。

最佳答案

问题是eduction返回一个惰性序列。我认为 Clojure 对于如果不强制的话它将实现多少个惰性序列项有一些启发式的方法,在本例中它实现了 129 个项。如果示例代码中的倒数第二行更改为

,一切都会按预期工作
(vec (eduction increment-counter-xform (range 1000)))

它之所以有效,是因为 vec 强制实现整个序列。

关于clojure - 为什么具有副作用的 Clojure xform 的行为不符合预期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59535180/

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