Ord允许我使用“==”吗?

时间:2017-10-30 10:53:26

标签: haskell typeclass

我正在做一些测试功能,以便更多地了解Haskell,我这样做了:

constroiMSet :: Ord a => [a] -> [(a,Int)] 
constroiMSet( x:x1:xs) |x1==x =[(x,2)]

我没有得到的是这个功能的原因。此函数有Ord a,但它使用==来比较a。仅Ord a>=<=<不是>吗?

2 个答案:

答案 0 :(得分:10)

如果我们查看definition of the Ord课程,我们会看到:

class Eq a => Ord a where
  compare :: a -> a -> Ordering
  (<) :: a -> a -> Bool
  (<=) :: a -> a -> Bool
  (>) :: a -> a -> Bool
  (>=) :: a -> a -> Bool
  max :: a -> a -> a
  min :: a -> a -> a

所以这意味着每个类型a Ord a,也就是Eq a。因此支持a的{​​{1}}也支持Ord,因此Eq(==)

答案 1 :(得分:2)

查看类型类定义:

class Eq a => Ord a

现在假设数据类型:

data OTT = One | Two | Three

如果我使用deriving Ord将类型直接派生到Ord,或者我给出了一个实现它会制动,因为我没有说明如何实现Eq,所以一个可行的方法将是:

data OTT = One | Two | Three deriving Eq, Ord

由于约束Eq

class Eq a =>是强制性的