2012-11-08 39 views
12

看着爲every?源代碼明確爲什麼爲什麼應該(每個字符串?[])都是正確的?

(every? string? []) => true 

這是因爲every?遞歸實現,並使用(nil? (seq coll))結束遞歸。但是,我的問題是,這種行爲有什麼意義?剛剛絆倒了那個。

我已經解決了使用

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

確實如此,空矢量的每個元素都是一個字符串。 –

+3

'every?'是由積極態度的人寫的 – Ankur

回答

9

因爲它的功能與所有的量詞相同。也就是說,它最初被假定爲真,並且謂詞的每個應用都試圖證明它是錯誤的。存在量詞(在Clojure中稱爲some而不是any?)與此相反 - 它假定爲假,謂詞的每個應用程序都試圖證明它是真實的。

換句話說,對於所有的東西都是正確的,並且對於一些東西都是正確的總是假的。

+0

你可以鏈接到一個參考,解釋這是如何有意義嗎?我認爲這是Set Theory的東西,但它並不直觀。 – noahlz

+0

這與形式邏輯有關,而不是集合論(儘管你可以在集合論中介紹它)。這實際上是非常直觀的,如果你考慮像Pawels這樣的否定答案 - 「X中的所有x都是真的」與「x中沒有x不是真的x」是一樣的。 「每一個」對於空序列都是錯誤的,這也會導致相當多的表達過於複雜。 – Cubic

+0

Paweł發佈了一個鏈接。 – 0dB

0

或更好,問爲什麼要(every? string? [])產量false我的問題?在某些要求中,兩種變體都會導致錯誤答案。但顯然這比在空序列上得到一個錯誤要好。

+0

在空序列上出現錯誤顯然會更​​好;它可能不會更好!我們有一些代碼在生產中被炸燬,因爲如果我沒有記錯的話,這種行爲會在Scala中摺疊。我並不是說吹起來是錯誤的,只是在某種情況下,任何特定的行爲都會傷害到你。真的,你想要一個足夠強大的類型系統來阻止你在空列表上執行這些操作。 –

+0

Yay for Haskell,我很欣賞並從中學習到,但是,我會堅持使用Clojure並嘗試處理像這樣的有時令人驚訝的問題:-) – 0dB

+1

@ 0dB如果您熟悉通用量化,我想即使是Haskell人也會告訴你,空列表和非空列表的類型是不同的。 – Cubic

8

功能every?實施universal quantification

(every? string? []) => false將遵循[]包含對象x這樣(string? x) => false(這是多麼全稱量詞的negation作品)。這導致矛盾,所以(every? string? [])必須返回true

7

它在數學中定義如此,有一個很好的理由。如果every?是以其他方式定義的話,那將是一致性災難。

當前定義的連接結果滿足every? foo當且僅當所有級聯集合也滿足every? foo。對空列表製作every?回報false會打破這種方便的等價和其他主機(例如去除一個元素,有時會導致從true切換every?false。)

+0

我也喜歡這個「常識」的答案:-) – 0dB

0

我的回答是vacuous truth
維基覆蓋得很好,所以我會簡單地引用當前第一段:

在數學和邏輯,一個空洞的事實是,斷言 是空集的所有成員都有一定的屬性的陳述。例如,對於 示例,只要房間中沒有手機,則「房間中的所有手機都關閉」語句 將爲真。在這個 的情況下,聲明「房間裏的所有手機都打開了」, 也是真實的,就像兩個連接一樣:「房間裏的所有手機都打開和關閉」。

0

它歸結爲「和」和「或」操作的標識值。對於任何布爾型B,B具有與B & T相同的值。因此,沒有值的「和」必須是真實的。同樣,B | F也與B具有相同的值,所以沒有值的「或」是錯誤的。

以類似的方式,無項的乘積是1,無項的和是0,這些是乘法和加法運算符的標識值。

相關問題