有人可以向我解释如何制作自定义数据类型吗?
**我不允许对Suit本身进行修改,例如。推导(Eq,Ord)
data Suit = Clubs | Diamonds | Hearts | Spades deriving (Eq)
我的尝试:
instance Ord Suit where
compare suit1 suit2 = compare suit1 suit2
但这似乎是连续循环并且不会停止。
答案 0 :(得分:8)
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
您的实际订购可能会有所不同,但这应该会为您提供基本的想法。
答案 1 :(得分:4)
您可以使用具有相同效果的standalone deriving。
deriving instance Enum Suit
deriving instance Ord Suit
答案 2 :(得分:3)
编写自定义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
,但这可能更容易理解。