Learn You a Haskell显示Bool
类型:
data Bool = False | True deriving (Ord)
我不理解比较Bool
的原因。
> False `compare` True
LT
> True `compare` False
GT
如果Bool
未从Ord
派生出来会丢失什么?
答案 0 :(得分:35)
Bool
形成bounded lattice *,其中False
底部,True
顶部。这个有界点阵定义了一个(总)排序,其中False
确实严格小于True
。 (它们也是这个格子的唯一元素。)
布尔运算and
和or
也可以分别在此晶格中被视为 meet 和 join 。 Meet找到最大下限并且join找到最小上限。这意味着a && False = False
与底部和其他任何东西的下限都是底部相同,a || True = True
与顶部和任何顶部的上限相同。所以使用布尔值的排序属性的meet和join相当于你熟悉的布尔运算。
您可以使用min
和max
在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时,第二个参数中的非严格)分别是} False
或True
,而min
和max
不是。
另外,一个小的修正: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等。