我想在Haskell做一个纸牌游戏
我定义了以下数据类型
data Rank = R2 | R3 | R4 | R5 | R6 | R7 | R8 | R9 | R10 | J | Q | K | A
deriving (Bounded, Enum, Eq, Ord)
data Suit = S | H | D | C
deriving (Bounded, Enum, Eq, Ord, Show)
data Card = Card { rank :: Rank, suit :: Suit }
deriving (Eq, Ord)
type Deck = [Card]
Run Code Online (Sandbox Code Playgroud)
然后我试图为一整套牌定义一个常数:
fullDeck :: Deck
fullDeck = [
Card{R2,S}..........
Run Code Online (Sandbox Code Playgroud)
背后,对于在甲板上的每卡还有更多的卡
.当我尝试编译此我得到错误"输入R2解析错误"
但是我定义R2为排名数据类型的一部分,而且我不确定,为什么它是没有正确工作
您正在混合位置和字段表示法.使用:
Card R2 S
Run Code Online (Sandbox Code Playgroud)
要么
Card{rank=R2, suit=S}
Run Code Online (Sandbox Code Playgroud)
表达方式:
Card{R2,S}
Run Code Online (Sandbox Code Playgroud)
无效.
有一个NamedFieldPuns扩展,允许你写一些类似于你写的东西.特别是它允许以下内容:
aCard = Card{rank,suit}
where
rank = R2
suit = S
Run Code Online (Sandbox Code Playgroud)
代替:
aCard = Card{rank=rank, suit=suit}
where
rank = R2
suit = S
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,您必须使用字段的名称,以便编译器能够推断您要填充的字段.
扩展还允许避免模式中的重复:
f (Card{rank, suit}) = ...
Run Code Online (Sandbox Code Playgroud)
代替:
f (Card{rank=rank, suit=suit}) = ...
Run Code Online (Sandbox Code Playgroud)
这是在未启用扩展的情况下必须使用的语法.