这是我的做法(基本上是@epsilonhalbe的想法):
data Suit
= Spade | Heart | Club | Diamond
deriving (Eq, Ord, Enum, Show, Bounded)
data Pip
= Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine
| Ten | Jack | Queen | King
deriving (Eq, Ord, Enum, Show, Bounded)
data Card = Card
{ suit :: Suit
, pip :: Pip
} deriving (Eq,Ord, Show, Bounded)
instance Enum Card where
toEnum i =
let (d,m) = i `divMod` (fromEnum (maxBound :: Pip) + 1)
in Card (toEnum d) (toEnum m)
fromEnum (Card s p) = fromEnum s * (fromEnum (maxBound :: Pip) + 1) + fromEnum p
这给你:
λ> take 5 $ [minBound .. maxBound] :: [Card]
[Card {suit = Spade, pip = Ace},Card {suit = Spade, pip = Two},Card {suit = Spade, pip = Three},Card {suit = Spade, pip = Four},Card {suit = Spade, pip = Five}]
PS:现在你应该得到所有 - 抱歉我搞砸了maxBound
忘记了一个额外的