2015-04-03 59 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