[英]Couldn't match expected type `Bool' with actual type `Card -> Bool'
有我的代码:
data Suit = Spade | Heart | Diamond | Club deriving (Eq, Show)
data CVal = Ace | King | Queen | Jack | Ten | Nine | Eight | Seven | Six | Five | Four | Three | Two deriving Show
data Card = Card Suit CVal deriving Show
sameSuit :: Card -> Card -> Bool
sameSuit (Card Spade _) (Card Spade _) = True
sameSuit (Card Heart _) (Card Heart _) = True
sameSuit (Card Diamond _) (Card Diamond _) = True
sameSuit (Card Club _) (Card Club _) = True
sameSuit (Card x _) (Card y _) = False
getNumber :: Card -> Int
getNumber (Card _ Two) = 2
getNumber (Card _ Three) = 3
getNumber (Card _ Four) = 4
getNumber (Card _ Five) = 5
getNumber (Card _ Six) = 6
getNumber (Card _ Seven) = 7
getNumber (Card _ Eight) = 8
getNumber (Card _ Nine) = 9
getNumber (Card _ Ten) = 10
getNumber (Card _ Jack) = 11
getNumber (Card _ Queen) = 12
getNumber (Card _ King) = 13
getNumber (Card _ Ace) = 14
beats :: Card -> Card -> Bool
beats x y = if sameSuit (x y) && getNumber(x) > getNumber(y) then True else False
错误信息:
Couldn't match expected type `Bool' with actual type `Card -> Bool'
In the return type of a call of `sameSuit'
In the first argument of `(&&)', namely `sameSuit (x y)'
In the expression: sameSuit (x y) && getNumber (x) > getNumber (y)
我不明白为什么我不能在“节拍”中调用功能“sameSuit”。 如果我从前奏中调用它,比如前奏曲> sameSuit(Card Club 10)(Card Club Ace),它返回正确的值和功能类型是Bool,而不是“Card - > Bool”。 我做错了什么? 有人可以向我解释一下吗?
在beats
您似乎试图将多个函数称为function(args)
,使用类似C的语法。 Haskell不使用这种语法; 函数应用程序由简单的标记邻接编写,只有嵌套表达式才需要括号。
getNumber(x)
是无害的,但没有意义。 它被解析为函数getNumber
到括号表达式(x)
,这当然等于getNumber x
,所以它可以做你想要的。
sameSuit (xy)
被解析为函数sameSuit
应用于单个参数,括号表达式(xy)
。 子表达式又是函数x
到y
的应用,在这种情况下没有意义,因为x
是Card
,而不是函数。 你需要为sameSuit
提供两个参数,就像在sameSuit xy
。
由于sameSuit
属于Card -> Card -> Bool
, sameSuit
只提供一个参数的sameSuit
属于Card -> Bool
。 这是编译器向您报告的错误; 你显然不能&&
一个功能和Bool
。
如果编译器以不同的顺序检查事物,它也会告诉你xy
不是Card
类型,而x
不是函数。
纠正的beats
实施是:
beats x y = (sameSuit x y) && (getNumber x > getNumber y)
所以,你可以在beats
调用sameSuit
,但你必须使用parens。
编辑 :实际上,你不需要parens。 在您的代码中,您调用的是sameSuit (xy)
,但是您必须在没有parens的情况下调用它: sameSuit xy
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.