Haskell “如何修复”;“非法数据类型上下文”;(使用-XDatatypeContexts)?

Haskell “如何修复”;“非法数据类型上下文”;(使用-XDatatypeContexts)?,haskell,Haskell,我是Haskell的新学员,我的代码如下: data Num a=>Units a = Units a (SymbolicManip a ) deriving (Eq) 我不知道怎么修 有人能帮我吗?数据类型中的类型类上下文现在被认为是一个不太有用的特性。问题是以下内容无法编译: foo :: Units a -> a foo (Units x _) = x+x 这应该是可以编译的,因为Units a参数只能为满足Num a的类型a构造。因此,在销毁(模式匹配)时,

我是Haskell的新学员,我的代码如下:

data Num a=>Units a = Units a (SymbolicManip a )

      deriving (Eq)
我不知道怎么修


有人能帮我吗?

数据类型中的类型类上下文现在被认为是一个不太有用的特性。问题是以下内容无法编译:

foo :: Units a -> a
foo (Units x _) = x+x
这应该是可以编译的,因为
Units a
参数只能为满足
Num a
的类型
a
构造。因此,在销毁(模式匹配)时,应该能够访问
numa
实例。但情况并非如此,销毁时也必须反直觉地提供
Num a

foo :: Num a => Units a -> a
foo (Units x _) = x+x
因此,标准建议是从
Units a
数据类型声明中删除约束
Num a
,并将其添加到涉及
Units a
的每个函数中

另一个选项是启用GADT并将数据类型更改为:

data Units a where
   Units :: Num a => a -> SymbolicManip a -> Units a
这做了一件“正确”的事情:需要一个
Num
实例来构造一个值,而不是在销毁时提供。这样,上面的第一个
foo
声明将被很好地键入


我几乎忘记了“quick&dirty”选项,该选项用于启用过时的数据类型上下文特性:这是通过在文件开头添加行来完成的

{-# LANGUAGE DatatypeContexts #-}

尽管如此,我还是希望修改代码而不是启用此语言扩展。

可能的重复而不是调用所有的
gadt
,我认为
存在量化
就可以了。