2015-02-07 53 views
1

我是哈斯克尔的新手。我得到这个问题:不在范围内:数据构造函数?

Assignment12.hs:5:12:不在范围:数据构造'西装 '

Assignment12.hs:5:18:不在范围:数据构造'排名'

Assignment12.hs:6:11:不范围:数据构造`等级 '

Assignment12.hs:7:11:不范围:数据构造`等级'

Assignment12.hs:8: 11:不在范围内:数据构造函数`其他' 失败,已加载模块:n一。

这是我的代码:

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 

我真的很感谢你的帮助。谢谢

+1

你'Ace'两次,而不是处理'King'或'Queen' - 它看起来像'Ace'应该有值13,然后'King','Queen' ,“杰克”? – Lee 2015-02-07 10:40:32

回答

6

在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 
+1

'否则'子句中的'Num'不是'Int',所以不能编译。 – Lee 2015-02-07 10:38:30

+0

谢谢@李我现在改变了。 – 2015-02-07 10:42:59

+0

非常感谢。这样可行 :) – Achref 2015-02-08 15:16:03