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

时间:2014-03-24 23:04:42

标签: haskell

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

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

      deriving (Eq)

我不确定如何修复它?

任何人都可以帮助我?

1 个答案:

答案 0 :(得分:15)

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

foo :: Units a -> a
foo (Units x _) = x+x

这应该直观地编译,因为Units a参数只能为满足a的类型Num a构建。因此,在销毁(模式匹配)时,应该能够访问Num a实例。但事实并非如此,Num a也必须在销毁时违反提供

foo :: Num a => Units a -> a
foo (Units x _) = x+x

因此,标准建议是从Num a数据类型声明中删除约束Units a,并将其添加到涉及Units a的每个函数中。

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

data Units a where
   Units :: Num a => a -> SymbolicManip a -> Units a

这是“正确”的事情:构造值需要Num a个实例,而是在 destruction 上提供。通过这种方式,上面的第一个foo声明将被很好地输入。


我几乎忘记了“快速和肮脏”选项,即启用过时数据类型上下文功能:这是通过在文件开头添加行

来完成的。
{-# LANGUAGE DatatypeContexts #-}

但是,我宁愿修改代码而不是启用此语言扩展。