前奏"和#34;和#34;或#34;空列表上的函数

时间:2014-12-04 20:01:23

标签: haskell ghci

我刚开始使用GHCI玩Haskell。 REPL带有一堆内置函数。例如andor来减少布尔列表[Bool] -> Bool。令我感到非常惊讶的是,对于空列表,它给出了:

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

这种行为有充分的理由吗?我有点期待相反的结果。在这两种情况下,即使False对我来说也更合理。

2 个答案:

答案 0 :(得分:9)

在这两种情况下,它们都给出了操作的标识元素:

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

对于每个操作,它都是“什么都不做”的布尔值,这使得它成为你什么都不作为输入时返回的完美选择!

这与sumproduct分别以01开头的方式相同。

答案 1 :(得分:7)

如果我们改为谈论all, any :: (a -> Bool) -> [a] -> Bool,这会更容易理解。直观地:

  1. all p搜索列表,以查找谓词p反例。当且仅当找到这样的反例时,它才会返回False
  2. any p搜索列表以查找满足谓词p示例。当且仅当找到这样的示例时,它才返回True
  3. 因此:

    1. all p []为真,因为空列表不包含p的任何反例。
    2. any p []为false,因为空列表不包含满足p的任何示例。
    3. 请注意:

      and == all id
      or  == any id
      

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

      请注意,数学逻辑通常也是这样的:

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

      如果独角兽不存在,这个命题是正确的。逻辑新手也因此而感到困惑......