DatatypeContexts在最新的GHC中弃用:为什么?

我刚刚做了一些Haskell开发,我重新编译了GHC新版本中的一些旧代码:

The Glorious Glasgow Haskell Compilation System, version 7.2.1 

当我做了我收到以下错误:

警告:-XDatatypeContexts已被弃用:它被广泛认为是错误的,并且已经从Haskell语言中删除。

当您使用以下格式的代码时会出现:

 data Ord a => MyType a = ConstructorOne a = ConstructorTwo aa 

我的问题是:为什么这个function首先被弃用,我应该做什么,而不是实现相同或相似的function?

它被弃用,因为它一个错误的,实际上并没有任何有用的function! 它所做的只是在其他地方强加了一堆额外的限制。 特别是在这种types的模式匹配时,你将不得不添加一个约束,而不是(正如最初所希望的那样)可以访问一个上下文,这是基于一个必须可用于构造值的知识首先。

实际上以另一种方式工作并为您跟踪已知上下文的“replace”是使用GADT风格的声明 :

 data MyType a where ConstructorOne :: Ord a => a -> MyType a ConstructorTwo :: Ord a => a -> a -> MyType a 

一般来说,GADT在许多其他方面也更加灵活,但是对于这种特殊情况, 创build一个值需要Ord约束,随后与值一起携带,并且构造函数上的模式匹配将其拉回。 所以你甚至不需要使用它的函数的上下文,因为你知道,由于预期了某种types的MyType a ,你会得到一个Ord a约束。

一般来说,你仍然需要在任何使用你的MyTypetypes的函数中添加Ord a约束,因此看起来并没有那么有用。 有关删除的原因的更多信息,请参阅http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts

我也得到这个错误。 ntc2的build议为我工作,除了它应该在'TypeContext',即cabal install --ghc-option '-XDatatypeContexts' <package>