Hoogle解释了Data.List的or
和and
:
and
返回布尔列表的连接。结果是 没错,列表必须是有限的;然而,假的结果是假的 在有限或无限列表的有限指数处的值。
or
返回布尔列表的析取。结果是 错,列表必须是有限的;但是,确实是真的 在有限或无限列表的有限指数处的值。
根据阅读这些定义,为什么or []
和and []
分别评估为False
和True
?
*Main> :m Data.List
Prelude Data.List> or []
False
Prelude Data.List> and []
True
答案 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)
在操作上,or
和and
分别与(||)
和(&&)
折叠。如果我们有or [] = True
,那么or
总会产生True
;类似地,and [] = False
意味着and
总是会产生False
。
在语义上它也有意义。我推荐你math.stackexchange作一个很好的解释。
答案 2 :(得分:3)
查看source,因为它们被定义为
and = foldr (&&) True
or = foldr (||) False
因此,在空列表foldr
上分别返回True
和False
的初始值and
和or
。
答案 3 :(得分:2)
对于or
,[]
是有限的,并且在任何索引处都没有True
值,因此它必须是False
。 []
在任何索引处都没有False
个值,因此and []
必须为True
。
这也适用于递归的基本情况,因为False
是or
的标识,而True
是and
的标识。对于所有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
那么。