this is how i will do it (basically @epsilonhalbe idea):
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 sp) = fromEnum s * (fromEnum (maxBound :: Pip) + 1) + fromEnum p
this gives you:
λ> 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: now you should get everything - sorry I messed up maxBound , forgetting one extra
source share