2015-04-03 155 views
1
data BoolLit = T | F 
instance Eq BoolLit where 
    b1 == b2 = True 

data BExp = BoolLit | 
      Or BExp BExp 

bEval :: BExp -> BoolLit 
bEval T = T 

我得到以下語法錯誤:語法錯誤模式匹配代數數據類型

Couldn't match expected type 'BExp' with actual type 'BoolLit' 
In the pattern: T 
In an equation for 'bEval': bEval T = T 

的數據聲明宣佈,BoolLit是BExp。
所以,我不明白爲什麼哈斯克爾給出了一個錯誤。
我想知道爲什麼以及如何糾正它。
謝謝。

+2

這是一個類型的錯誤,而不是一個語法錯誤。 – 2015-04-03 15:31:44

回答

4

您已聲明與構造T :: BoolLitF :: BoolLit類型BoolLit,你也宣佈與構造BoolLit :: BExpOr :: BExp -> BExp -> BExp類型BExp。如果你想換行BoolLit類型,你需要表達,在BExp的構造函數:

data BExp = BoolLit BoolLit | Or BExpr BExpr 

然後,你可以寫bEval作爲

bEval (BoolLit T) = T 

另外請注意,您已經定義了你Eq實例始終返回T,無論==的參數是什麼。您需要在此模式匹配:

instance Eq BoolLit where 
    T == T = True 
    F == F = True 
    _ == _ = False 

或者你可以讓GHC弄清楚你使用deriving爲:

data BoolLit = T | F deriving (Eq) 
+0

您的答案與我從中獲得代碼的書相同。我不明白爲什麼這本書使用BoolLit BoolLit而不是BoolLit。我現在明白了。謝謝。 – User137481 2015-04-04 12:49:49