为什么这些过滤器,一个使用AND,一个使用OR,在Clojure中评估相同?

时间:2016-04-17 15:45:19

标签: clojure

这是在Clojure中使用AND的过滤器:

(filter #(and (= 0 (mod % 3) (mod % 5))) (range 100))

正如我所料,它会回归

(0 15 30 45 60 75 90)

另一方面,这是使用OR而不是AND的相同过滤器:

(filter #(or (= 0 (mod % 3) (mod % 5))) (range 100))

对我而言,它会返回完全相同的列表没有意义,但确实如此。为什么没有OR的列表返回

(3, 5, 6, 9, 10 ...)

1 个答案:

答案 0 :(得分:4)

当您使用=时,它会查看传递给它的所有参数是否相等。在每个示例中,过滤器检查是否0 = (mod % 3) = (mod % 5)。相反,请分别检查每个案例:

(filter #(or (= 0 (mod % 3)) (= 0 (mod % 5))) (range 100))

您也可以考虑使用zero?。我认为它使阅读更容易,并有助于避免像这样的问题。

(filter #(or (zero? (mod % 3)) (zero? (mod % 5))) (range 100))