不在范围内:数据构造函数?

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 并且没有处理KingQueen - 看起来Ace 应该有值13 然后KingQueenJack 【参考方案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 我现在已经改变了。

以上是关于不在范围内:数据构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥类的常量数据成员需要在构造函数中初始化?

为啥不在构造函数中启动一个线程?如何终止?

绝不在构造函数和析构函数中调用虚函数

绝不在构造函数和析构函数中调用虚函数

为啥不在构造函数中调用可覆盖的方法?

NO.8:绝不在构造或者析构过程中调用virtual函数