我只是在做一些Haskell开发,我在新版本的GHC上重新编译了一些旧代码:
The Glorious Glasgow Haskell Compilation System, version 7.2.1
当我这样做的时候,我收到了以下错误:
警告:-XDatatypeContexts已被弃用:它被广泛认为是一个错误功能,并已从Haskell语言中删除。
当您具有以下格式的代码时,将会出现:
data Ord a => MyType a
= ConstructorOne a
| ConstructorTwo a a
我的问题是:为什么这个功能一开始就被弃用了,我应该怎么做才能实现相同或相似的功能?
发布于 2011-09-16 07:46:55
它被弃用了,因为它是一个错误的功能,实际上没有任何有用的功能!它所做的一切只是在其他地方强制了一堆额外的约束。特别是,当在这样的类型上进行模式匹配时,您将被迫添加一个约束,而不是(正如人们最初希望的那样)访问上下文,这是基于这样的知识:首先必须有可用的值来构造该值。
“替换”实际上是以另一种方式工作,并为您跟踪已知的上下文,即use GADT-style declarations instead
data MyType a where
ConstructorOne :: Ord a => a -> MyType a
ConstructorTwo :: Ord a => a -> a -> MyType a
一般来说,GADT在许多其他方面也更灵活,但对于这种特殊情况,创建一个值需要Ord
约束,该约束随后与值一起携带,构造函数上的模式匹配将其拉回。因此,您甚至不需要使用它的函数的上下文,因为您知道,由于期望的是MyType a
类型的内容,因此您将获得一个Ord a
约束。
发布于 2011-09-16 07:39:09
通常,您仍然需要向使用您的MyType
类型的任何函数添加Ord a
约束,因此并不像看起来那么有用。有关删除它们的原因的更多信息,请参见http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts
https://stackoverflow.com/questions/7438600
复制相似问题