使用整数值在Haskell中构造另一种数据类型

And*_*Ali 1 haskell types

我正在尝试定义具有扑克牌等级的数据类型.

  data Suit = Spades | Clubs | Hearts | Diamonds deriving Show 
  data Rank = 2|3|4|5|6|7|8|9|10 | Jack | Queen | King | Ace deriving Show
  data Card = Card Rank Suit
Run Code Online (Sandbox Code Playgroud)

我无法将数字[2..10]作为排名,我确实尝试用数字代替LowerRanks Int,它会运行代码很好,但它不允许我调出任何数字.

data Suit = Spades | Clubs | Hearts | Diamonds deriving Show 
data Rank = LowerRank Int | Jack | Queen | King | Ace deriving Show
data Card = Card Rank Suit 
instance Show Card where
  show (Card x y) = show x ++ " of " ++ show y
Run Code Online (Sandbox Code Playgroud)

我可以写: Card Jack Spades我会得到的Jack of Spades.但是,当我尝试编写时Card 2 Spades,我收到一个错误:

No instance for (Num Rank) arising from the literal ‘2’
In the first argument of ‘Card’, namely ‘2’
Run Code Online (Sandbox Code Playgroud)

Tho*_*son 7

数据构造函数必须以大写字母或冒号开头,数字不是有效的构造函数.你可以写出排名,例如:

data Rank = Two | Three | Four | ...
Run Code Online (Sandbox Code Playgroud)

如您所述,您也可以拥有一个完整的字段:

data Rank = RNum Int | Jack | Queen | King | Ace
Run Code Online (Sandbox Code Playgroud)

旁注:我不明白这个问题"它不允许我拨打任何号码".将来请发布您尝试的实际代码和错误消息.随意澄清,我会编辑这个答案.

有了这个第二版,Rank我们可以构建每张卡,例如:

 twoH = Card (RNum 2) Hearts
 threeD = Card (RNum 3) Dimonds
Run Code Online (Sandbox Code Playgroud)

值得为等级制作一个自定义有界实例,并为Card,Suit提供有限的实例.衍生Ord也会很好,但是你想要为大多数纸牌游戏准备合适的套装.