【问题标题】: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

标签: haskell


【解决方案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 我现在已经改变了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多