FromEnum toEnum Instance?

data Suit = Spade | Heart | Club | Diamond deriving (Eq, Ord, Enum, Show) data Pip = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King deriving (Eq, Ord, Enum, Show) data Card = Card {suit :: Suit ,pip :: Pip } deriving (Eq,Ord, Show) type Deck = [Card] data EOBoard = EOBoard {foundations :: [Deck] ,columns :: [Deck] ,reserve :: [Deck] } deriving (Eq, Ord, Show) instance Enum Card where 

This is the solitaire data structure. How to make Card enumerable, with Enum instances from Card{suit = Spade, pip = Ace} , Card{suit = Spade, pip = Two} .. Card{suit = Heart, pip = Ace} .. Card{suit = Club, pip = Ace} .. Card{suit = Diamond, pip = Ace} ..Card{suit = Diamond, pip = King} .

+5
source share
1 answer

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

+5
source

Source: https://habr.com/ru/post/1236251/


All Articles