不在范围内:数据构造函数?
Posted
技术标签:
【中文标题】不在范围内:数据构造函数?【英文标题】:Not in scope: data constructor? 【发布时间】:2015-02-07 10:29:45 【问题描述】:我是 Haskell 的新手。我遇到了这个问题:
Assignment12.hs:5:12:不在范围内:数据构造函数 `Suit'
Assignment12.hs:5:18:不在范围内:数据构造函数 `Rank'
Assignment12.hs:6:11:不在范围内:数据构造函数“Rank”
Assignment12.hs:7:11:不在范围内:数据构造函数 `Rank'
Assignment12.hs:8:11:不在范围内:数据构造函数“否则” 失败,已加载模块:无。
这是我的代码:
data Suit = Clubs | Diamonds | Hearts | Spades deriving (Show, Eq)
data Rank = Jack | Queen | King | Ace | Num Int deriving (Show, Eq)
type Card = (Suit, Rank)
cardValue :: Card -> Int
cardValue (Suit, Rank)
| Rank == Ace = 11
| Rank == Ace = 11
| Rank == Jack = 10
| Otherwise = Num
非常感谢您的帮助。谢谢
【问题讨论】:
您有两次Ace
并且没有处理King
或Queen
- 看起来Ace
应该有值13 然后King
、Queen
、Jack
?
【参考方案1】:
在 haskell 中,变量名必须以小写字母开头。任何大写字母都会被编译器解释为Data Constructor,这就是您收到该错误的原因。
当您定义 cardRank
时,变量 (suit, rank)
必须以小写字母开头,您的代码才能编译。
这应该可行
data Suit = Clubs | Diamonds | Hearts | Spades deriving (Show, Eq)
data Rank = Jack | Queen | King | Ace | Num Int deriving (Show, Eq)
type Card = (Suit, Rank)
cardValue :: Card -> Int
cardValue (suit, rank)
| rank == Ace = 11
| rank == Ace = 11
| rank == Jack = 10
cardValue (suit, Num x) = x
【讨论】:
otherwise
子句中的 Num
不是 Int
,因此无法编译。
谢谢@Lee 我现在已经改变了。以上是关于不在范围内:数据构造函数?的主要内容,如果未能解决你的问题,请参考以下文章