and [] True Prelude> or [] Fa-6ren">
gpt4 book ai didi

haskell - 为什么 "and []"为真而 "or []"为假

转载 作者:行者123 更新时间:2023-12-04 02:30:22 24 4
gpt4 key购买 nike

为什么空列表上的“and”返回true,是否意味着空列表为True?抱歉,我无法正确阅读和理解这一点,所以请纠正我。谢谢。

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

最佳答案

在数学中,谈论二元运算通常很有用,例如 && , || , + , *等作为具有身份。标识是一个值 e使得以下属性适用于某些通用二元运算 <>

e <> x = x
x <> e = x

对于我上面列出的运算符,它们是可交换的,这意味着 x <> y = y <> x为所有 xy ,所以我们只需要检查上述属性之一。对于 and ,有问题的二元运算符是 && , 对于 or二元运算符是 || .如果我们制作 Cayley table对于这些操作,它看起来像
&&    | False | True
------+-------+------
False | False | False
True | False | True


|| | False | True
------+-------+------
False | False | True
True | True | True

如您所见,对于 &&如果你有 True && FalseTrue && True ,答案总是 && 的第二个参数.对于 || , 如果你有 False || FalseFalse || True ,答案总是第二个参数,所以每个参数的第一个参数必须是那些运算符下的标识元素。简单地说:
True && x = x
x && True = x

False || x = x
x || False = x

因此,当没有要对其执行操作的元素时,首选答案是每个操作的标识元素。

考虑 + 的标识元素可能会有所帮助。和 * ,它们是 01分别:
x + 0 = x = 0 + x
x * 1 = x = 1 * x

您还可以将其扩展到列表连接( ++[] )、 a -> a 类型函数的函数组合等操作( (.)id ),以及许多其他人。由于这开始看起来像一个模式,你可能会问这是否已经是 Haskell 中的一个东西,并且确实是。模块 Data.Monoid定义 Monoid抽象这种模式的类型类,它的最小定义是
class Monoid a where
mempty :: a -- The identity
mappend :: a -> a -> a -- The binary operator

它甚至别名 mappend<>为了易于使用(我在上面选择它作为通用二元运算符并非偶然)。我鼓励您查看该模块并尝试使用它的定义。源代码很容易阅读并且很有启发性。

关于haskell - 为什么 "and []"为真而 "or []"为假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25427590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com