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

Lor*_*les 0 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]
Run Code Online (Sandbox Code Playgroud)

然后我试图为一整套牌定义一个常数:

fullDeck :: Deck
fullDeck   = [
              Card{R2,S}..........
Run Code Online (Sandbox Code Playgroud)

背后,对于在甲板上的每卡还有更多的卡
.当我尝试编译此我得到错误"输入R2解析错误"
但是我定义R2为排名数据类型的一部分,而且我不确定,为什么它是没有正确工作

Bak*_*riu 5

您正在混合位置和字段表示法.使用:

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)

这是在未启用扩展的情况下必须使用的语法.