看着爲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))
因爲它的功能與所有的量詞相同。也就是說,它最初被假定爲真,並且謂詞的每個應用都試圖證明它是錯誤的。存在量詞(在Clojure中稱爲some
而不是any?
)與此相反 - 它假定爲假,謂詞的每個應用程序都試圖證明它是真實的。
換句話說,對於所有的東西都是正確的,並且對於一些東西都是正確的總是假的。
或更好,問爲什麼要(every? string? [])
產量false
我的問題?在某些要求中,兩種變體都會導致錯誤答案。但顯然這比在空序列上得到一個錯誤要好。
功能every?
實施universal quantification。
從(every? string? []) => false
將遵循[]
包含對象x
這樣(string? x) => false
(這是多麼全稱量詞的negation作品)。這導致矛盾,所以(every? string? [])
必須返回true
。
它在數學中定義如此,有一個很好的理由。如果every?
是以其他方式定義的話,那將是一致性災難。
當前定義的連接結果滿足every? foo
當且僅當所有級聯集合也滿足every? foo
。對空列表製作every?
回報false
會打破這種方便的等價和其他主機(例如去除一個元素,有時會導致從true
切換every?
到false
。)
我也喜歡這個「常識」的答案:-) – 0dB
我的回答是vacuous truth。
維基覆蓋得很好,所以我會簡單地引用當前第一段:
在數學和邏輯,一個空洞的事實是,斷言 是空集的所有成員都有一定的屬性的陳述。例如,對於 示例,只要房間中沒有手機,則「房間中的所有手機都關閉」語句 將爲真。在這個 的情況下,聲明「房間裏的所有手機都打開了」, 也是真實的,就像兩個連接一樣:「房間裏的所有手機都打開和關閉」。
它歸結爲「和」和「或」操作的標識值。對於任何布爾型B,B具有與B & T
相同的值。因此,沒有值的「和」必須是真實的。同樣,B | F
也與B具有相同的值,所以沒有值的「或」是錯誤的。
以類似的方式,無項的乘積是1,無項的和是0,這些是乘法和加法運算符的標識值。
確實如此,空矢量的每個元素都是一個字符串。 –
'every?'是由積極態度的人寫的 – Ankur