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

Rob*_*oli 65 haskell deprecated language-extension

我只是做了一些Haskell开发,并在新版本的GHC上重新编译了一些旧代码:

The Glorious Glasgow Haskell Compilation System, version 7.2.1
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我收到以下错误:

警告:不推荐使用-XDatatypeContexts:它被广泛认为是错误的,并且已从Haskell语言中删除.

当您拥有以下格式的代码时,会出现这种情况:

data Ord a => MyType a
    = ConstructorOne a
    = ConstructorTwo a a
Run Code Online (Sandbox Code Playgroud)

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

C. *_*ann 95

它已弃用,因为它一个错误的,并没有实际上任何有用的功能!它所做的就是在其他地方强制施加一些额外的限制.特别是,当在这种类型上进行模式匹配时,您将被迫添加一个约束,而不是(正如人们最初希望的那样)基于必须具有构造值的知识来访问上下文.首先.

实际上以另一种方式工作并跟踪已知上下文的"替换"是使用GADT样式的声明:

data MyType a where
    ConstructorOne :: Ord a => a -> MyType a
    ConstructorTwo :: Ord a => a -> a -> MyType a
Run Code Online (Sandbox Code Playgroud)

GADT通常在许多其他方面也更灵活,但对于这种特殊情况,发生的事情是创建值需要Ord约束,然后随值一起携带,并且构造函数上的模式匹配将其拉回.所以你甚至不需要使用它的函数的上下文,因为你知道由于期望某种类型的东西MyType a,你会得到Ord a它的约束.

  • @fakedrake我的意思是这不应该经常出现.你几乎总是不想限制你的类型.一个例子就是为什么它使你的类型不可能成为一个`Functor`,`Foldable`,`Traversable`,`Applicative`,`Monad`,`Alternative`,`MonadPlus`,`Arrow`等等. (3认同)

iva*_*anm 10

通常,您仍然需要将Ord a约束添加到使用您的MyType类型的任何函数,因此它看起来没那么有用.有关删除原因的详细信息,请参阅http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts