查看源代码every?
可以清楚地说明原因
(every? string? []) => true
这是因为every?
递归实现并用于(nil? (seq coll))
结束递归。但是,我的问题是,这种行为有什么意义?刚刚被那个绊倒了。
我已经解决了我的问题
(and (seq x) (every? string? x))
查看源代码every?
可以清楚地说明原因
(every? string? []) => true
这是因为every?
递归实现并用于(nil? (seq coll))
结束递归。但是,我的问题是,这种行为有什么意义?刚刚被那个绊倒了。
我已经解决了我的问题
(and (seq x) (every? string? x))
因为它的功能与 forall-quantifier 相同。也就是说,它最初被假定为真,并且谓词的每次应用都是试图证明它是假的。存在量词(因为不一致some
而any?
在 Clojure 中被调用)以相反的方式工作 - 它假设为假,并且谓词的每次应用都是试图证明它是真的。
换句话说,某事对所有人来说都是真的总是正确的,而某事对没有人来说是真的总是错误的。
它在数学中如此定义,这是有充分理由的。every?
如果以任何其他方式定义,这将是一场一致性灾难。
使用当前定义,every? foo
当且仅当所有连接的集合也满足时,连接的结果才满足every? foo
。在空列表上every?
返回false
会破坏这种方便的等价性和许多其他等价性(例如,删除一个元素有时会导致从 切换every?
到true
。false
)
或者更好地问为什么要(every? string? [])
yield false
?在某些要求中,这两种变体都会导致错误的答案。但显然这比在空序列上出错要好。
我的回答是空洞的事实。
Wiki 很好地涵盖了它,所以我将简单地引用当前的第一段:
在数学和逻辑中,空洞的真理是断言空集的所有成员都具有某种属性的陈述。例如,只要房间里没有手机,“房间里所有手机都关闭”的陈述就会成立。在这种情况下,“房间里的所有手机都打开”的陈述也将是空洞的,就像两者的合取一样:“房间里的所有手机都打开和关闭”。
它归结为“and”和“or”操作的标识值。对于任何布尔值 B,B 具有与 相同的值B & T
。因此,没有值的“与”必须为真。类似地,与 B 具有相同的值也是正确B | F
的,因此没有值的“或”是错误的。
类似地,无项的乘积为 1,无项之和为 0,它们是乘法和加法运算符的恒等值。