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它的约束.
iva*_*anm 10
通常,您仍然需要将Ord a约束添加到使用您的MyType类型的任何函数,因此它看起来没那么有用.有关删除原因的详细信息,请参阅http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts
| 归档时间: |
|
| 查看次数: |
6006 次 |
| 最近记录: |