为什么`和`为空可折叠返回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) 

对于我们所有的xsxs = xs ++ []所以,

  and xs 
= and (xs ++ [])
= (and xs) && (and []) 

考虑到and xs可能是TrueFalse它遵循,

True  = True  && (and [])
False = False && (and [])

因此,我们必须有and []True

另一答案

大多数具有类似功能的语言都是如此。这是因为“真”是“&&”的标识(意思是x && True == x)。同样,“假”是“||”的标识(意思是x || False == x)。

以上是关于为什么`和`为空可折叠返回True,但`或`在Haskell中返回False? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

帆软下拉框不选为空可选择显示全部值

我们如何配置一个类的空可移动组件(对象字段)?

2021-04-09【技术】关于空数组和空对象为true的问题

python好玩的小工具(正在create中)

为啥 all() 为空的可迭代对象返回 True? [复制]

为啥 Stream.allMatch() 为空流返回 true?