![](/img/trans.png)
[英]what does ((Ord, Ord) -> Bool) -> [String] -> String mean in haskell
[英]Understanding Haskell's Bool Deriving an Ord
了解一下Haskell提供了Bool
类型:
data Bool = False | True deriving (Ord)
我不明白比较Bool
的原因。
> False `compare` True
LT
> True `compare` False
GT
如果Bool
没有从Ord
那里得到什么会失去什么?
Bool
形成一个有界格子 *,其中False
是底部 , True
是顶部 。 这个有界点阵定义了一个(总)排序,其中False
确实严格小于True
。 (它们也是这个晶格的唯一元素。)
布尔运算and
和or
也可以分别在此晶格中看作是满足和连接 。 Meet找到最大下限并且join找到最小上限。 这意味着a && False = False
与底部和其他任何东西的下限都是底部,并且a || True = True
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
请注意,这些定义在存在不同类型的底部时不等效,因为(&&)
和(||)
是短路的(当第一个分别为False
或True
,第二个参数中为非严格)而min
和max
不是。
另外,一个小的修正: deriving
条款并没有说Bool
“来源于” Ord
。 它指示GHC导出类型类的实例Ord
的类型Bool
。
*更具体地说,是补充的分配格 。 更具体地说,还有一个布尔代数 。
当您需要比较内部包含Bool
值时, Bool
的Ord
实例变得更加重要。 例如,没有它我们将无法编写如下表达式:
[False,True] `compare` [False,True,False]
(3, False) < (3, True)
data Person = Person { name :: String, member :: Bool } deriving (Eq, Ord)
等等
这是因为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都不是底部存在的标识元素。 这与讨论&& vs min等的评论有关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.