无法将类型同义词与 Either 匹配
Couldn't match type Synonym with Either
我是初学者Haskell。但不太确定 Either
在模式匹配中是如何工作的。
这是我的代码:
type Rank = Either Pip Court
type Pip = Int
type Deck = [Card]
data Card = Joker | Card Suit Rank
data Court = Ace | Jack | Queen | King deriving (Show, Eq, Ord)
data Suit = Hearts | Diamonds | Clubs | Spades deriving (Show, Ord, Eq)
snap :: Card -> Card -> String
snap Joker Joker = "SNAP"
snap (Card s1 r1) (Card s2 r2)
| r1 == r2 = "SNAP"
snap _ _ = "..."
GHCi 告诉我 Couldn't match type ‘Court’ with ‘Either Pip Court’
,有人可以帮我吗?
Either
不仅仅是类型的联合;它是一个 tagged 联合,这意味着每个值都必须明确指定包装值出现在哪个 "side" 类型上。这是一个示例,(使用为您的 Card
类型派生的 Show
实例):
*Main> Card Hearts Jack
<interactive>:3:13: error:
• Couldn't match type ‘Court’ with ‘Either Pip Court’
Expected type: Rank
Actual type: Court
• In the second argument of ‘Card’, namely ‘Jack’
In the expression: Card Hearts Jack
In an equation for ‘it’: it = Card Hearts Jack
Card
需要一个类型为 Either Pip Court
的参数,但你给了它一个普通的 Court
值。使用显式换行:
*Main> Card Hearts (Right Jack)
Card Hearts (Right Jack)
这同样适用于创建编号卡片:
*Main> Card Hearts 3
<interactive>:5:13: error:
• No instance for (Num Rank) arising from the literal ‘3’
• In the second argument of ‘Card’, namely ‘3’
In the expression: Card Hearts 3
In an equation for ‘it’: it = Card Hearts 3
*Main> Card Hearts (Left 3)
Card Hearts (Left 3)
您不需要更改 snap
的定义,因为 Either
已经有一个 Eq
实例,只要两个包装类型都具有 Eq
实例本身;它认为任何 Right
值不等于任何 Left
值,并且如果包装值相等,则匹配的 Right
或 Left
值相等。
*Main> snap (Card Hearts (Right Jack)) (Card Hearts (Left 3))
"..."
*Main> snap (Card Hearts (Right Jack)) (Card Spades (Right Jack))
"SNAP"
我是初学者Haskell。但不太确定 Either
在模式匹配中是如何工作的。
这是我的代码:
type Rank = Either Pip Court
type Pip = Int
type Deck = [Card]
data Card = Joker | Card Suit Rank
data Court = Ace | Jack | Queen | King deriving (Show, Eq, Ord)
data Suit = Hearts | Diamonds | Clubs | Spades deriving (Show, Ord, Eq)
snap :: Card -> Card -> String
snap Joker Joker = "SNAP"
snap (Card s1 r1) (Card s2 r2)
| r1 == r2 = "SNAP"
snap _ _ = "..."
GHCi 告诉我 Couldn't match type ‘Court’ with ‘Either Pip Court’
,有人可以帮我吗?
Either
不仅仅是类型的联合;它是一个 tagged 联合,这意味着每个值都必须明确指定包装值出现在哪个 "side" 类型上。这是一个示例,(使用为您的 Card
类型派生的 Show
实例):
*Main> Card Hearts Jack
<interactive>:3:13: error:
• Couldn't match type ‘Court’ with ‘Either Pip Court’
Expected type: Rank
Actual type: Court
• In the second argument of ‘Card’, namely ‘Jack’
In the expression: Card Hearts Jack
In an equation for ‘it’: it = Card Hearts Jack
Card
需要一个类型为 Either Pip Court
的参数,但你给了它一个普通的 Court
值。使用显式换行:
*Main> Card Hearts (Right Jack)
Card Hearts (Right Jack)
这同样适用于创建编号卡片:
*Main> Card Hearts 3
<interactive>:5:13: error:
• No instance for (Num Rank) arising from the literal ‘3’
• In the second argument of ‘Card’, namely ‘3’
In the expression: Card Hearts 3
In an equation for ‘it’: it = Card Hearts 3
*Main> Card Hearts (Left 3)
Card Hearts (Left 3)
您不需要更改 snap
的定义,因为 Either
已经有一个 Eq
实例,只要两个包装类型都具有 Eq
实例本身;它认为任何 Right
值不等于任何 Left
值,并且如果包装值相等,则匹配的 Right
或 Left
值相等。
*Main> snap (Card Hearts (Right Jack)) (Card Hearts (Left 3))
"..."
*Main> snap (Card Hearts (Right Jack)) (Card Spades (Right Jack))
"SNAP"