2014-12-04 49 views
5

我剛開始使用GHCI哈斯克爾玩。 REPL帶有一些內置函數。例如andor以減少布爾列表[Bool] -> Bool。我很驚奇地發現,對於空列表,它給出了:前奏曲「和」和「或」上的空列表功能

Prelude> and [] 
True 
Prelude> or [] 
False 

這樣的行爲是否有很好的理由?我有點期待相反的結果。在這兩種情況下,即使False看起來對我來說都更合理。

回答

9

在這兩種情況下,他們給操作者的身份元素:

True && x == x 
False || x == x 

對於每個操作,那就是「什麼都不做」,這使得它完美的選擇,當你得到什麼作爲返回布爾一個輸入!

這與sumproduct分別以01開始的方式相同。

+0

謝謝。現在這是有道理的。 :) – 2014-12-04 20:07:00

7

這很容易理解,如果我們不是談論all, any :: (a -> Bool) -> [a] -> Bool。直覺:

  1. all p搜索列表中找到一個謂詞p。當且僅當找到這樣一個反例時,才返回False
  2. any p搜索列表以找到滿足謂詞p示例。當且僅當找到這樣一個例子時,它才返回True

因此:因爲空表不包含任何反例p

  1. all p []是真實的。
  2. any p []是假的,因爲空表不包含滿足p任何例子。

需要注意的是:

and == all id 
or == any id 

所以這種推理延伸到and, or :: [Bool] -> Bool

需要注意的是數理邏輯也往往是這樣的:

-- "All unicorns are Argentinian." 
∀x. unicorn(x) → argentinian(x) 

這個命題,如果不存在獨角獸是真的。邏輯新手得到這個困惑,以及...

+0

謝謝。 「每一個」和「任何」類比都非常有用。我正在考慮將這些功能作爲「摺疊」。 該死的,現在我不知道誰的答案更好:) – 2014-12-04 20:23:25