解析我定义的数据类型的错误

时间:2014-10-10 10:45:51

标签: haskell types

我试图在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数据类型的一部分,我不确定它为什么没有正确工作

2 个答案:

答案 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