我是Haskell的新学习者,我的代码如下:
data Num a=>Units a = Units a (SymbolicManip a )
deriving (Eq)
我不确定如何修复它?
任何人都可以帮助我?
答案 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 #-}
但是,我宁愿修改代码而不是启用此语言扩展。