【问题标题】:Why should (every? string? []) yield true?为什么(每个?字符串?[])应该产生真?
【发布时间】:2017-01-03 16:28:12
【问题描述】:

查看every? 的源代码可以清楚为什么

(every? string? []) => true

这是因为every?是递归实现的,使用(nil? (seq coll))来结束递归。但是,我的问题是,这种行为有什么意义?刚刚被那个绊倒了。

我已经解决了我的问题

(and (seq x) (every? string? x))

【问题讨论】:

  • 确实,空向量的每个元素都是一个字符串。
  • every? 是一个态度积极的人写的

标签: clojure


【解决方案1】:

因为它的功能与 forall-quantifier 相同。也就是说,它最初被假定为真,并且谓词的每次应用都是试图证明它是假的。存在量词(在 Clojure 中称为 some 而不是 any? 是因为不一致)的工作方式相反 - 它假定为假,并且谓词的每次应用都是试图证明它是正确的。

换句话说,某事对所有无为真总是正确的,而某事对无为真的总是错误的。

【讨论】:

  • 能否请您链接到解释这如何有意义的参考?我认为这是集合论的东西,但它根本不直观。
  • 这更多地与形式逻辑有关,而不是与集合论有关(尽管您可以在集合论中引入它)。如果您考虑一下 Pawels 回答中的否定,这实际上是非常直观的——“X 中的所有 x 都为真”与说“X 中没有 x 不为真”是一样的。 every? 为空 seq 为 false 也会使很多表达式过于复杂。
  • 其实是相当一致的?和一些而不是任何?每一个?只能返回true或false,但有些返回第一个truthy(不是nil或false)值,所以它不是真正的谓词。
  • @NielsK 这是使其合理化的一种方法。我——而且我认为大多数其他人——会期望有一个“任何?”如果有every?some 的行为与“任何?”的组合相同。并且“查找优先”在某种程度上是一个陷阱,即使它对 Clojures thruthiness 政策是有意义的。
【解决方案2】:

函数every? 实现universal quantification

(every? string? []) => false 可以得出[] 包含一个对象x 使得(string? x) => false(这就是通用量词的negation 的工作方式)。这会导致矛盾,所以(every? string? []) 必须返回true

【讨论】:

    【解决方案3】:

    它在数学中的定义是有充分理由的。如果以任何其他方式定义every?,那将是一场一致性灾难。

    根据当前定义,当且仅当所有串联集合也满足every? foo 时,串联结果满足every? foo。让every? 在空列表上返回false 会破坏这种方便的等价性和许多其他等价性(例如,删除一个元素有时会导致将every?true 切换到false。)

    【讨论】:

    • 我也喜欢这个“常识”的答案:-)
    【解决方案4】:

    或者更好地问为什么(every? string? []) 产生false?在某些要求中,这两种变体都会导致错误的答案。但显然这比在空序列上出错要好。

    【讨论】:

    • 在空序列上出错显然更好;它实际上可能不会更好!如果我没记错的话,由于这种行为,我们在生产中遇到了一些代码爆炸,如果我没记错的话,是 Scala 中的一个折叠。我并不是说爆炸是错误的,只是在某些情况下,任何特定的行为都会伤害到你。确实,您需要一个足够强大的类型系统来阻止您对空列表执行这些操作。
    • 感谢 Haskell,我很欣赏并从中学到了东西,但是,我会坚持使用 Clojure 并尝试处理有时像这样令人惊讶的问题 :-)
    • @0dB 如果您熟悉全称量化,那一点也不奇怪,而且我认为即使是 Haskell 人员也会告诉您,为空列表和非空列表设置不同的类型是很疯狂的。跨度>
    • @Cubic 哎呀,你可能是对的,没有费心去想它:-)
    【解决方案5】:

    我的答案是vacuous truth
    Wiki 很好地涵盖了它,所以我将简单地引用当前的第一段:

    在数学和逻辑中,空洞的真理是断言 空集的所有成员都具有某种性质。为了 例如,声明“房间内所有手机都已关闭” 只要房间里没有手机,就会出现这种情况。在这 在这种情况下,“房间里的所有手机都已打开”这句话会 也是空洞的,就像两者的结合一样:“所有细胞 房间里的电话打开和关闭”。

    【讨论】:

      【解决方案6】:

      归结为“and”和“or”操作的标识值。对于任何布尔值 B,B 的值与 B & T 相同。因此,没有值的“与”必须为真。同样,B | F 与 B 具有相同的值也是正确的,因此没有值的“或”是错误的。

      类似地,无项的乘积为 1,无项之和为 0,它们是乘法和加法运算符的恒等值。

      【讨论】:

        猜你喜欢
        • 2018-06-12
        • 1970-01-01
        • 2016-12-30
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多