为什么`和`为空可折叠返回True,但`或`在Haskell中返回False? [重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么`和`为空可折叠返回True,但`或`在Haskell中返回False? [重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
是否有理由可以解释这些结果是否可以预期?它们比未定义更好吗?
>>> any (const True) []
False
>>> any (const False) []
False
>>> or []
False
>>> and []
True
我真的不明白报告试图说的是什么:
-- and returns the conjunction of a Boolean list. For the result to be
-- True, the list must be finite; False, however, results from a False
-- value at a finite index of a finite or infinite list. or is the
-- disjunctive dual of and.
and, or :: [Bool] -> Bool
and = foldr (&&) True
or = foldr (||) False
答案
为了扩展Dan的答案,真值的空列表的结合是真的True
允许你扩展连接的预期属性到那种情况。
例如,我们希望如此,
and (xs ++ ys) = (and xs) && (and ys)
对于我们所有的xs
,xs = xs ++ []
所以,
and xs
= and (xs ++ [])
= (and xs) && (and [])
考虑到and xs
可能是True
或False
它遵循,
True = True && (and [])
False = False && (and [])
因此,我们必须有and []
是True
。
另一答案
大多数具有类似功能的语言都是如此。这是因为“真”是“&&”的标识(意思是x && True == x)。同样,“假”是“||”的标识(意思是x || False == x)。
以上是关于为什么`和`为空可折叠返回True,但`或`在Haskell中返回False? [重复]的主要内容,如果未能解决你的问题,请参考以下文章
2021-04-09【技术】关于空数组和空对象为true的问题