clojureでマップされた関数の進行状況をどのように監視する必要がありますか?
命令型言語でレコードを処理するとき、私は頻繁にメッセージを印刷して、1000レコードごとにレポートするなど、状況がどこまで進んだかを示します。基本的に、これはループの繰り返しをカウントしています。
レコードのシーケンスに関数をマッピングしている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)
この効果を達成する他の(より良い)方法はありますか?
私がしていることに落とし穴はありますか?(例えば、私は怠惰を保ち、頭を抱えていないと思います。)