我开始使用Clojure做Project Euler作为学习Clojure的首次尝试。我已经解决了第一个任务:
找出1000以下3或5的倍数之和。
我以前用Python解决过这个问题:
sum(i for i in xrange(1000) if i%3==0 or i%5==0)
这是我第一次尝试编写Clojure代码:
(reduce +
(filter
(fn [x]
(or
(= 0 (mod x 3))
(= 0 (mod x 5))))
(range 1000)))
我对它的冗长感到惊讶,但我相信这是因为我的风格和对Clojure习语的无知。
那么,这段Clojure代码的习惯用法版本会是什么样子呢?
(apply + (for [i (range 1000) :when (some zero? (map (partial mod i) [3 5]))] i))
- A. Webb