clojure.core /或partial函数适用于第一个参数但不适用于第二个参数

(defn divisible [x y](零?(rem x y)))

>((或(fn [x](可分割的x 3))(fn [x](可分的x 5)))3)
>((或(fn [x](可分割x 3))(fn [x](可分x 5)))5)

第一个表达式是真的,但不是第二个表达式为什么?

>有人可以解释一下这里发生的事情吗?

最佳答案
形式(或foo bar)的表达式不会将两个谓词“粘合”成一个复合谓词;如果它是真的,它会返回foo,否则吧.在你的代码中,(fn [x](可分割的x 3))当然是真的(唯一的假值是假和零),所以整个事情相当于

((fn [x] (divisible x 3)) 3)
((fn [x] (divisible x 3)) 5)

你想做的就是这样

(some #(apply % 3) [(fn [x] (divisible x 3)) (fn [x] (divisible x 5)])
(some #(apply % 5) [(fn [x] (divisible x 3)) (fn [x] (divisible x 5)])
              ; ^- here goes the thing being tested

一般来说,

(defn or-preds [& preds]
  (fn [& args]
    (some #(apply % args) preds)))

((or-preds (fn [x] (divisible x 3)) (fn [x] (divisible x 5))) 3)
((or-preds (fn [x] (divisible x 3)) (fn [x] (divisible x 5))) 5)
;; or simpler...
((or-preds #(divisible % 3) #(divisible % 5)) 3)

转载注明原文:clojure.core /或partial函数适用于第一个参数但不适用于第二个参数 - 代码日志