在Haskell中为受限类型定义实例
我正在使用以下数据类型:在Haskell中为受限类型定义实例,haskell,Haskell,我正在使用以下数据类型: data Exp a = |Const a |Simetrico (Exp a) |Mais (Exp a) (Exp a) |Menos (Exp a) (Exp a) |Mult (Exp a) (Exp a) 但是a应该是数字类型。 我会这样定义Eq: instance Eq (Exp a) where a == b | ... = True | otherwise = False 但是我没有说我的a是一个数字
data Exp a =
|Const a
|Simetrico (Exp a)
|Mais (Exp a) (Exp a)
|Menos (Exp a) (Exp a)
|Mult (Exp a) (Exp a)
但是a
应该是数字类型。
我会这样定义Eq
:
instance Eq (Exp a) where
a == b | ... = True
| otherwise = False
但是我没有说我的
a
是一个数字类型,所以ghci抱怨说,我该如何解决这个问题?您在实例
子句中添加了一个类型约束:
instance Num a => Eq (Exp a) where
a == b | ... = True
| otherwise = False
instance Num a=>Eq(Exp a)其中
a==b |……=真的
|否则=假
因此,现在您可以假设(在
实例的范围内)a
是Num
类型类的一个实例。但现在我尝试使用show执行此操作,并弹出此错误:•无法推断(show a)由于在上下文中使用“show”而产生:Num a受Ficha8处实例声明的约束。hs:51:10-30可能的修复:将(show a)添加到实例声明的上下文中•在表达式中:show a在“show”的等式中:show(Const a)=在“show(Exp a)”的实例声明中显示a@DeltaXGamerPT:您可以添加额外的类型约束,如instance(show a,Num a)=>Eq(Exp a),其中…
。但是Eq
实例中的show
非常奇怪。对于show(Exp a)where
您可能还应该添加类型约束,因此instance show a=>show(Exp a)where…
。