我试图在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]
然后我试图为一整套牌定义一个常数:
fullDeck :: Deck
fullDeck = [
Card{R2,S}..........
在牌组中的每张牌后面都有更多的牌
当我尝试编译它时,我得到错误"输入R2上的解析错误"
然而,我将R2定义为Rank数据类型的一部分,我不确定它为什么没有正确工作
答案 0 :(得分:5)
您正在混合位置和字段表示法。使用:
Card R2 S
或
Card{rank=R2, suit=S}
表达式:
Card{R2,S}
无效。
有一个NamedFieldPuns
扩展名,可以让你写一些类似你写的东西。特别是它允许这样的事情:
aCard = Card{rank,suit}
where
rank = R2
suit = S
而不是:
aCard = Card{rank=rank, suit=suit}
where
rank = R2
suit = S
但是,在这种情况下,必须使用字段的名称,以便编译器能够推断出要填充的字段。
扩展也允许避免模式中的重复:
f (Card{rank, suit}) = ...
而不是:
f (Card{rank=rank, suit=suit}) = ...
这是在未启用扩展程序的情况下必须使用的语法。
答案 1 :(得分:3)
那是因为fullDeck
应该是这样的:
fullDeck :: Deck
fullDeck = [ Card R2 S, Card R6 C ]
你可以玩ghci:
λ> let a = Card R2 S
λ> a
a :: Card
λ> let b = Card {R2, S}
parse error on input `R2'
λ> let b = Card {rank = R2, suit = S}
λ> b
b :: Card