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 所以,我不明白为什么Haskell会出错 我想知道为什么以及如何纠正它 感谢。
答案 0 :(得分:4)
您已使用构造函数BoolLit
和T :: BoolLit
声明了类型F :: BoolLit
,并且您还使用构造函数BExp
和{{1}声明了类型BoolLit :: BExp
}}。如果你想包装Or :: BExp -> BExp -> BExp
类型,你需要在BoolLit
的构造函数中表达它:
BExp
然后您可以将data BExp = BoolLit BoolLit | Or BExpr BExpr
写为
bEval
另请注意,无论bEval (BoolLit T) = T
的参数是什么,您都已将Eq
个实例定义为始终返回T
。你需要在这里进行模式匹配:
==
或者,您可以让GHC使用instance Eq BoolLit where
T == T = True
F == F = True
_ == _ = False
:
deriving