Haskell “如何修复”;“非法数据类型上下文”;(使用-XDatatypeContexts)?
我是Haskell的新学员,我的代码如下: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构造。因此,在销毁(模式匹配)时,
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
,我认为存在量化
就可以了。