有人能告诉我如何使自定义数据类型可排序吗?
**我不允许修改Suit本身,例如。推导(Eq, Ord)
data Suit = Clubs | Diamonds | Hearts | Spades deriving (Eq)
我的尝试:
instance Ord Suit where
compare suit1 suit2 = compare suit1 suit2
但这似乎是一个连续的循环,并没有停止
Ord的定义看起来有点像(但不完全是)
class Ord a where
compare :: a -> a -> Ordering
和Ordering
有三个可能的值:LT, EQ, GT
。
instance Ord Suit where
compare Clubs Diamonds = LT
compare Diamonds Clubs = GT
compare Diamonds Diamonds = EQ
compare Diamonds _ = LT -- Diamonds are lower than everything besides Clubs and Diamonds
你的实际订单可能不同,但这应该给你一个基本的想法。
一种编写自定义Ord
实例的方法,您不必拼写每次比较的结果:
instance Ord Suit where
compare a b = compare (relativeRank a) (relativeRank b) where
relativeRank Diamonds = 1
relativeRank Clubs = 2
relativeRank Hearts = 3
relativeRank Spades = 4
在这里,您只需要提及每个构造函数一次,并且您可以轻松地决定不同的顺序。
您也可以使用compare Data.Function.on relativeRank
,但这可能更容易理解。
您可以使用独立派生来获得相同的效果。
deriving instance Enum Suit
deriving instance Ord Suit