我正在做一些测试功能,以便更多地了解Haskell,我这样做了:
constroiMSet :: Ord a => [a] -> [(a,Int)]
constroiMSet( x:x1:xs) |x1==x =[(x,2)]
我没有得到的是这个功能的原因。此函数有Ord a
,但它使用==
来比较a
。仅Ord a
,>=
,<=
,<
不是>
吗?
答案 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 =>
是强制性的