我发现向Clojure换能器添加副作用会导致以下意外行为: 为什么上面的代码块对于少量的样本而不是大量的样本,为什么将计数器增加预期的次数?看来即使 答案 0 :(得分:4) 问题是 之所以有效,是因为(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次。1 个答案:
eduction
返回一个惰性序列。我认为Clojure对于不强制执行它将实现的懒惰序列中的某些术语具有一些启发性,在这种情况下,它实现了129个术语。如果示例代码中的倒数第二行更改为(vec (eduction increment-counter-xform (range 1000)))
vec
迫使整个序列得以实现。