我剛開始使用GHCI哈斯克爾玩。 REPL帶有一些內置函數。例如and
和or
以減少布爾列表[Bool] -> Bool
。我很驚奇地發現,對於空列表,它給出了:前奏曲「和」和「或」上的空列表功能
Prelude> and []
True
Prelude> or []
False
這樣的行爲是否有很好的理由?我有點期待相反的結果。在這兩種情況下,即使False
看起來對我來說都更合理。
我剛開始使用GHCI哈斯克爾玩。 REPL帶有一些內置函數。例如and
和or
以減少布爾列表[Bool] -> Bool
。我很驚奇地發現,對於空列表,它給出了:前奏曲「和」和「或」上的空列表功能
Prelude> and []
True
Prelude> or []
False
這樣的行爲是否有很好的理由?我有點期待相反的結果。在這兩種情況下,即使False
看起來對我來說都更合理。
在這兩種情況下,他們給操作者的身份元素:
True && x == x
False || x == x
對於每個操作,那就是「什麼都不做」,這使得它完美的選擇,當你得到什麼作爲返回布爾一個輸入!
這與sum
和product
分別以0
和1
開始的方式相同。
這很容易理解,如果我們不是談論all, any :: (a -> Bool) -> [a] -> Bool
。直覺:
all p
搜索列表中找到一個反謂詞p
。當且僅當找到這樣一個反例時,才返回False
。any p
搜索列表以找到滿足謂詞p
的示例。當且僅當找到這樣一個例子時,它才返回True
。因此:因爲空表不包含任何反例p
all p []
是真實的。any p []
是假的,因爲空表不包含滿足p
任何例子。需要注意的是:
and == all id
or == any id
所以這種推理延伸到and, or :: [Bool] -> Bool
。
需要注意的是數理邏輯也往往是這樣的:
-- "All unicorns are Argentinian."
∀x. unicorn(x) → argentinian(x)
這個命題,如果不存在獨角獸是真的。邏輯新手得到這個困惑,以及...
謝謝。 「每一個」和「任何」類比都非常有用。我正在考慮將這些功能作爲「摺疊」。 該死的,現在我不知道誰的答案更好:) – 2014-12-04 20:23:25
謝謝。現在這是有道理的。 :) – 2014-12-04 20:07:00