gpt4 book ai didi

clojure.core/or 部分函数适用于第一个参数,但不适用于第二个参数

转载 作者:行者123 更新时间:2023-12-02 12:37:59 25 4
gpt4 key购买 nike

(defn 可整除 [x y] (零?(rem x y)))

  1. ((或 (fn [x] (可整除 x 3)) (fn [x] (可整除 x 5))) 3)
  2. ((或 (fn [x] (可整除 x 3)) (fn [x] (可整除 x 5))) 5)

第一个表达式的值为 true,但第二个表达式的值为 true,为什么?

  • 可以解释一下这里发生了什么吗?

最佳答案

(或 foo bar) 形式的表达式不会将两个谓词“粘合”成一个复合谓词;如果为真,则返回 foo,否则返回 bar。在您的代码中,(fn [x] (divisible x 3)) 当然是 true(唯一的 false 值是 falsenil) ,所以整个事情相当于

((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/or 部分函数适用于第一个参数,但不适用于第二个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3120730/

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