理解Haskell的Bool派生Ord

时间:2014-05-27 03:29:12

标签: haskell boolean

Learn You a Haskell显示Bool类型:

data Bool = False | True deriving (Ord)

我不理解比较Bool的原因。

> False `compare` True
LT
> True `compare` False
GT

如果Bool未从Ord派生出来会丢失什么?

3 个答案:

答案 0 :(得分:35)

Bool形成bounded lattice *,其中False 底部True 顶部。这个有界点阵定义了一个(总)排序,其中False确实严格小于True。 (它们也是这个格子的唯一元素。)

布尔运算andor也可以分别在此晶格中被视为 meet join 。 Meet找到最大下限并且join找到最小上限。这意味着a && False = False与底部和其他任何东西的下限都是底部相同,a || True = True与顶部和任何顶部的上限相同。所以使用布尔值的排序属性的meet和join相当于你熟悉的布尔运算。

您可以使用minmax在Haskell中显示:

False `min` True = False -- this is the greatest lower bound
False  &&   True = False -- so is this

False `max` True = True  -- this is the least upper bound
False  ||   True = True  -- so is this

这表明您可以从派生的&&实例定义||Ord

(&&) = min
(||) = max

请注意,这些定义在a different kind of bottom出现时并不等效,因为(&&)(||)是短路的(当第一个参数为{{1时,第二个参数中的非严格)分别是} FalseTrue,而minmax不是。

另外,一个小的修正:deriving条款没有说Bool"来自" Ord。它指示GHC为类型Ord派生类型类Bool 的实例。

*更具体地说,补充的分配格子。更具体地说,是boolean algebra

答案 1 :(得分:18)

当您需要比较内部某处包含Ord的值时,Bool的{​​{1}}实例变得更加重要。例如,如果没有它,我们将无法编写如下表达式:

Bool

答案 2 :(得分:-2)

这是因为Haskell的设计师犯了一个错误!我从未见过一本提到布尔序列的数学教科书。只是因为它们可能并不意味着应该。我们中的一些人完全使用Haskell是因为它在许多情况下不允许/保护我们免于混淆/荒谬的事情而不是这个。

instance Ord Bool会导致a => b表示您期望a <= b的意思!

早期的论据支持instance Ord Bool,您可以隐式地使更多类型具有可比性。继续这一论点,有些人可能希望使每种类型都具有可比性,甚至可以使用弱动态类型并省略类型类。但我们希望强类型完全禁止不明显正确的内容,instance Ord Bool会失败。

至于Bool是一个有界格子的论点。与boolean:= {True,False}不同,我们在Haskell中所拥有的是Bool:= {True,False,bottom}不再是有界点,因为True和False都不是底部存在的标识元素。这与那些讨论&amp;&amp; amp; vs min等。