gpt4 book ai didi

functional-programming - 用于进度报告的惯用 clojure?

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:05 25 4
gpt4 key购买 nike

我应该如何监控 clojure 中映射函数的进度?

当用命令式语言处理记录时,我经常打印一条消息来指示事情已经进行了多远,例如每 1000 条记录报告一次。本质上这是计算循环重复次数。

我想知道我可以在 clojure 中采用什么方法来实现这一点,我在 clojure 中将一个函数映射到我的记录序列上。在这种情况下,打印消息(甚至记录进度)似乎本质上是副作用。

到目前为止我的想法是这样的:

(defn report
[report-every val cnt]
(if (= 0 (mod cnt report-every))
(println "Done" cnt))
val)

(defn report-progress
[report-every aseq]
(map (fn [val cnt]
(report report-every val cnt))
aseq
(iterate inc 1)))

例如:

user> (doall (report-progress 2 (range 10)))
Done 2
Done 4
Done 6
Done 8
Done 10
(0 1 2 3 4 5 6 7 8 9)

是否有其他(更好的)方法可以达到这种效果?

我在做什么有什么陷阱吗? (我觉得我是在保持懒惰,比如不抱头。)

最佳答案

clojure 的伟大之处在于您可以将报告附加到数据本身而不是执行计算的代码。这允许您将这些逻辑上不同的部分分开。这是我的 misc.clj 中的一个 block ,我发现我几乎在每个项目中都使用了它:

(defn seq-counter 
"calls callback after every n'th entry in sequence is evaluated.
Optionally takes another callback to call once the seq is fully evaluated."
([sequence n callback]
(map #(do (if (= (rem %1 n) 0) (callback)) %2) (iterate inc 1) sequence))
([sequence n callback finished-callback]
(drop-last (lazy-cat (seq-counter sequence n callback)
(lazy-seq (cons (finished-callback) ()))))))

然后将报告器包裹在您的数据中,然后将结果传递给处理函数。

(map process-data (seq-counter inc-progress input))

关于functional-programming - 用于进度报告的惯用 clojure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2022911/

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