75

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

The Glorious Glasgow Haskell Compilation System, version 7.2.1

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

警告:-XDatatypeContexts 已被弃用:它被广泛认为是一个错误功能,并已从 Haskell 语言中删除。

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

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

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

4

2 回答 2

106

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

“替换”实际上以另一种方式工作并为您跟踪已知上下文,它是使用 GADT 样式的声明来代替

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

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

于 2011-09-15T23:46:54.690 回答
11

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

于 2011-09-15T23:39:09.380 回答