我刚开始使用GHCI玩Haskell。 REPL带有一堆内置函数。例如and
和or
来减少布尔列表[Bool] -> Bool
。令我感到非常惊讶的是,对于空列表,它给出了:
Prelude> and []
True
Prelude> or []
False
这种行为有充分的理由吗?我有点期待相反的结果。在这两种情况下,即使False
对我来说也更合理。
答案 0 :(得分:9)
在这两种情况下,它们都给出了操作的标识元素:
True && x == x
False || x == x
对于每个操作,它都是“什么都不做”的布尔值,这使得它成为你什么都不作为输入时返回的完美选择!
这与sum
和product
分别以0
和1
开头的方式相同。
答案 1 :(得分:7)
如果我们改为谈论all, any :: (a -> Bool) -> [a] -> Bool
,这会更容易理解。直观地:
all p
搜索列表,以查找谓词p
的反例。当且仅当找到这样的反例时,它才会返回False
。any p
搜索列表以查找满足谓词p
的示例。当且仅当找到这样的示例时,它才返回True
。因此:
all p []
为真,因为空列表不包含p
的任何反例。any p []
为false,因为空列表不包含满足p
的任何示例。请注意:
and == all id
or == any id
所以这个推理延伸到and, or :: [Bool] -> Bool
。
请注意,数学逻辑通常也是这样的:
-- "All unicorns are Argentinian."
∀x. unicorn(x) → argentinian(x)
如果独角兽不存在,这个命题是正确的。逻辑新手也因此而感到困惑......