假设我有一个数据类型,它代表一副扑克牌,像这样
data Suit = Clubs | Spades | Hearts | Diamonds deriving (Eq)
instance Show Suit where
show Diamonds = "♦"
show Hearts = "♥"
show Spades = "♠"
show Clubs = "♣"
data Value = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King | Ace deriving (Eq, Ord)
data Card = Card {
value :: Value
, suit :: Suit
} deriving (Eq, Ord)
实例 Show Card where show (Card vs) = show s ++ show v
Eq
Haskell 通过允许我推导而不Ord
明确指定这些关系已经对我有很大帮助。这特别有用,因为我想用它Ord
来根据扑克规则最终比较两只手的价值。
现在在扑克中,花色在排序方面并不重要。因此我尝试了
instance Ord Suit where
compare Clubs Spades = EQ
compare Clubs Hearts = EQ
compare Clubs Diamonds = EQ
compare Spades Hearts = EQ
compare Spades Diamonds = EQ
compare Hearts Diamonds = EQ
这已经有点冗长了......它甚至不起作用:
*P054> a
♠A
*P054> b
♣A
*P054> a < b
*** Exception: P054.hs:(12,9)-(17,36): Non-exhaustive patterns in function compare
那么,如何正确定义Suit
表达所有花色都相同的排序?