簡體   English   中英

無法將預期類型`Bool'與實際類型`Card - > Bool'匹配

[英]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) 子表達式又是函數xy的應用,在這種情況下沒有意義,因為xCard ,而不是函數。 你需要為sameSuit提供兩個參數,就像在sameSuit xy

由於sameSuit屬於Card -> Card -> BoolsameSuit只提供一個參數的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM