2015-11-18 12 views
5
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 

Si tratta di una struttura di dati solitario Come posso fare Card enumerabile, con Enum istanze da 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}.fromEnum toEnum Instance?

+1

uso hint' (daEnum $ maxBound Ace) * (dal seme di ENum) + (dal pip diEnum) 'a ca lculate the enumeration – epsilonhalbe

+2

@epsilonhalbe probabilmente intendete '(maxBound :: Pip)' o 'King' giusto? (per la prima è necessario 'derivante (..., limitato)' – Carsten

+0

ya Ho sempre capito male - avrei dovuto consultare i documenti per quello – epsilonhalbe

risposta

5

ecco come lo farei (in pratica l'idea di @ 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 

questo ti dà:

λ> 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: ora si deve ottenere tutto - mi dispiace incasinato il maxBound dimenticando quello in più

Problemi correlati