4Manuals

  • PDF Cloud HOME

为什么带有副作用的Clojure xform的行为不符合预期? Download

    如何一次从文件中读取一行文本,并将文本分配给Clojure中的变量 找不到匹配的方法:为com.google.api.services.bigquery.BigQueryImpl类创建

我发现向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次。

1 个答案:

答案 0 :(得分:4)

问题是eduction返回一个惰性序列。我认为Clojure对于不强制执行它将实现的懒惰序列中的某些术语具有一些启发性,在这种情况下,它实现了129个术语。如果示例代码中的倒数第二行更改为

,则一切正常
(vec (eduction increment-counter-xform (range 1000)))

之所以有效,是因为vec迫使整个序列得以实现。



Similar searches
    重新启动后,节点JS NET和HTTPS模块的处理请求非常缓慢 如何在Java中按给定位置打印矩阵的垂直和水平线? 在Windows上重启后Docker将不会自动启动 矩阵中出现的单词从左到右,向下或向左对角线(向上或向下) WordPress计算器的自定义编码