fromEnum toEnum Instance?

Joe*_*Joe 6 haskell

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
Run Code Online (Sandbox Code Playgroud)

这是一个纸牌数据结构怎样才能让Card枚举,与Enum从实例 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}.

Car*_*ten 6

这是我怎么做的(基本上是@ 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
Run Code Online (Sandbox Code Playgroud)

这给你:

?> 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}]
Run Code Online (Sandbox Code Playgroud)

PS:现在你应该得到所有 - 对不起,我搞砸了maxBound忘记一个额外的