代数数据类型模式匹配中的语法错误

时间:2015-04-03 14:47:07

标签: haskell algebraic-data-types

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会出错 我想知道为什么以及如何纠正它 感谢。

1 个答案:

答案 0 :(得分:4)

您已使用构造函数BoolLitT :: 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