【问题标题】:Logical AND in ClojureClojure 中的逻辑与
【发布时间】:2015-08-24 03:21:40
【问题描述】:

Clojure 的逻辑 and 与正常的逻辑 and (&&) 不同吗?为什么这会产生真实的

((and odd? #(> 10 %)) 6)

and 不需要 2 个 true 语句来返回 true 吗?

【问题讨论】:

    标签: clojure logic


    【解决方案1】:

    and 不一定返回 true。如果任何给定元素是falsenil,它实际上返回falsenil。如果它们都不是,则返回最后一个元素(它不返回 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)?而是从字面上查找falsenil
    • and 不知道 6 并且它不组成函数。如果你想编写你有every-pred的函数,它是some-fn的补充
    • 阿米尔,你可以这样想:Clojure 中的每个对象都是真的(包括对象true,以及所有的函数等等),除了nilfalse,它们是唯一错误的对象。任何计算为真对象的东西当然都算作真,而任何计算为假对象的东西当然也算作假。有时人们用“真”和“假”来区分。
    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 2011-04-21
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2021-03-03
    • 2012-09-30
    相关资源
    最近更新 更多