使自定义数据类型可排序



有人能告诉我如何使自定义数据类型可排序吗?

**我不允许修改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

最新更新