Haskell 从枚举到实例?

Haskell 从枚举到实例?,haskell,Haskell,这是一个纸牌数据结构 如何使Card可枚举,并从中使用Enum实例 Card{suit=Spade,pip=Ace},Card{suit=Spade,pip=Two}卡片{suit=Heart,pip=Ace}卡片{suit=Club,pip=Ace}卡片{suit=Diamond,pip=Ace}..Card{suit=Diamond,pip=King}以下是我的做法(基本上是@epsilonhalbe的想法): 这将为您提供: data Suit = Spade | Heart | C

这是一个纸牌数据结构 如何使
Card
可枚举,并从中使用
Enum
实例
Card{suit=Spade,pip=Ace}
Card{suit=Spade,pip=Two}
<代码>卡片{suit=Heart,pip=Ace}<代码>卡片{suit=Club,pip=Ace}<代码>卡片{suit=Diamond,pip=Ace}..Card{suit=Diamond,pip=King}

以下是我的做法(基本上是@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


PS:现在你应该得到全部-抱歉我弄乱了
maxBound
忘记了一个额外的提示使用
(fromEnum$maxBound Ace)*(fromEnum suit)+(fromEnum pip)
计算enumeration@epsilonhalbe你可能是指
(maxBound::Pip)
King
对吧?(对于第一个你需要
派生(…,有界)
ya我总是弄错-我应该为此咨询文档,但是suit和pip在卡片中,如果suit和pip被maxBound分开怎么工作?maxBound应该是卡片{suit=Diamond,pip=King}@Joe看到了我的答案并开始玩它-基本上,这个想法是如何枚举图像中的像素-通过从上到下的行和从左到右的行中的像素((0,0)->(1,0)->…(0,1)->(1,1)->…)-如果你想从(x,y)->索引开始,你可以计算y*图像宽度+x(然后用余数除法返回)-这里只有
x=Pip
y=Suit
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}]