为什么(每个?字符串?[])产生真实?

0dB*_*0dB 12 clojure

查看源代码every?可以明确原因

(every? string? []) => true
Run Code Online (Sandbox Code Playgroud)

这是因为every?以递归方式实现并用于(nil? (seq coll))结束递归.但是,我的问题是,这种行为有何意义?刚刚绊倒了.

我已经解决了我的问题

(and (seq x) (every? string? x))
Run Code Online (Sandbox Code Playgroud)

Cub*_*bic 9

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

换句话说,对于所有人来说,某些事情都是真的总是如此,并且对于某些人来说,某些事情是真的总是错误的.


Paw*_*ski 8

功能every?实现了通用量化.

(every? string? []) => false它开始会[]包含一个对象,x这样(string? x) => false(这就是通用量词的否定工作方式).这导致了矛盾,所以(every? string? [])必须回归true.


Raf*_*ird 7

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

使用当前定义,every? foo当且仅当所有连接集合也满足时,连接的结果才满足every? foo.使every?收益false上的空列表会打破这种方便的等价和其他主机(例如去除一个元素,有时会导致切换every?truefalse.)