【发布时间】:2015-08-24 03:21:40
【问题描述】:
Clojure 的逻辑 and 与正常的逻辑 and (&&) 不同吗?为什么这会产生真实的
((and odd? #(> 10 %)) 6)
and 不需要 2 个 true 语句来返回 true 吗?
【问题讨论】:
Clojure 的逻辑 and 与正常的逻辑 and (&&) 不同吗?为什么这会产生真实的
((and odd? #(> 10 %)) 6)
and 不需要 2 个 true 语句来返回 true 吗?
【问题讨论】:
and 不一定返回 true。如果任何给定元素是false 或nil,它实际上返回false 或nil。如果它们都不是,则返回最后一个元素(它不返回 true)。
在您的情况下,and 返回函数#(> 10 %)(仅此而已),然后将其应用于6,从而产生true。这是因为这两个函数既不是nil 也不是false。
以下是这些步骤的工作方式:
((and odd? #(> 10 %)) 6)
(#(> 10 %) 6)
;; => true
您正在寻找的是组合谓词函数:
((every-pred odd? #(> 10 %)) 6) ;; => false
仅供参考:还有它的补码“or”:some-fn。
【讨论】:
(odd? 6) 是假的。为什么它会进行下一个表达式?根据逻辑的定义,如果它的第一个元素返回false,则返回false。
and 不评估(以我编写代码的方式)(odd? 6) 和(> 10 6)?而是从字面上查找false 或nil?
and 不知道 6 并且它不组成函数。如果你想编写你有every-pred的函数,它是some-fn的补充
true,以及所有的函数等等),除了nil 和false,它们是唯一错误的对象。任何计算为真对象的东西当然都算作真,而任何计算为假对象的东西当然也算作假。有时人们用“真”和“假”来区分。