了解Data.List或&和空列表

时间:2014-05-01 02:52:11

标签: haskell

Hoogle解释了Data.List的orand

  

and返回布尔列表的连接。结果是   没错,列表必须是有限的;然而,假的结果是假的   在有限或无限列表的有限指数处的值。

     

or返回布尔列表的析取。结果是   错,列表必须是有限的;但是,确实是真的   在有限或无限列表的有限指数处的值。

根据阅读这些定义,为什么or []and []分别评估为FalseTrue

*Main> :m Data.List

Prelude Data.List> or []
False

Prelude Data.List> and []
True

5 个答案:

答案 0 :(得分:5)

and xs对应于“xs的所有元素都为真”的陈述。数学逻辑定律说这应该等同于“xs中存在一个假的元素是错误的”(对于我所暗示的一些形式逻辑,参见here)。

空列表中存在错误的元素显然是错误的。所以这表明and []应该返回True。返回False会不一致,但我们可以想象它是一个错误,只是说空列表中and未定义。但是,如果某人有一个用例,他们希望True获取and [],那么他们可以明确检查空列表并做他们想做的事情而不是;这正是and []抛出运行时错误时必须要做的事情。因此,即使对于True不恰当的答案的用例,我们也没有真正获得任何错误,因此我们也可以保持与逻辑的类比并返回True。并且以这种方式实现起来更容易,因为您不必将空列表视为特殊情况;明显的折叠只做正确的事:and = foldr (&&) True

对于or同样的推理适用,只是“反过来”。 or xs对应于声明“存在xs的元素是真的”。从这个角度来看,or []显然不包含任何真实的元素,因此结果应该是False。而且,两者都保持与形式逻辑的类比,并且是最容易实现的,所以没有理由不这样做。

答案 1 :(得分:3)

在操作上,orand分别与(||)(&&)折叠。如果我们有or [] = True,那么or总会产生True;类似地,and [] = False意味着and总是会产生False

在语义上它也有意义。我推荐你math.stackexchange作一个很好的解释。

答案 2 :(得分:3)

查看source,因为它们被定义为

and = foldr (&&) True
or  = foldr (||) False

因此,在空列表foldr上分别返回TrueFalse的初始值andor

答案 3 :(得分:2)

对于or[]是有限的,并且在任何索引处都没有True值,因此它必须是False[]在任何索引处都没有False个值,因此and []必须为True

这也适用于递归的基本情况,因为Falseor的标识,而Trueand的标识。对于所有xs:

or  (False:xs) = or  xs
and (True :xs) = and xs

顺便提一下,这些是递归定义的一部分

答案 4 :(得分:0)

以这种方式思考:

如果列表中的任何项目为or(否则为True),则

True会返回False

or []:你能看到多少True个元素?没有。那么那就是False

如果任何项目为and,则

False会返回False

and []:同样,您可以看到多少False个元素?没有。那就是True那么。