在 Haskell 中将实例定义为受限类型

3

我正在使用以下数据类型:

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会报错,我该如何解决?

1个回答

4

您可以在 instance 子句中添加类型约束:

instance <b>Num a =></b> Eq (Exp a) where
         a == b | ... = True
                | otherwise = False

现在你可以假定(在instance的范围内)a是一个Num类型类的实例。


但是现在我尝试使用show来做,然后出现了这个错误: • 无法推断出(Show a)的来源于‘show’的使用 来自上下文:Num a 在Ficha8.hs:51:10-30处的实例声明所限定 可能的解决方法: 将(Show a)添加到实例声明的上下文中 • 在表达式中:show a 在“show”的等式中:show (Const a) = show a 在“Show (Exp a)”实例声明中 - DeltaX Gamer PT
3
你可以添加额外的类型约束,例如 instance (Show a, Num a) => Eq (Exp a) where ...。但在一个 Eq 实例中使用 show 是相当奇怪的。 - Willem Van Onsem
1
对于 Show (Exp a) where,你可能还应该添加类型约束,因此 instance Show a => Show (Exp a) where ... - Willem Van Onsem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接