首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >DatatypeContexts在最新的GHC中被弃用:为什么?

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

Stack Overflow用户
提问于 2011-09-16 07:28:47
回答 2查看 7.1K关注 0票数 73

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

代码语言:javascript
复制
The Glorious Glasgow Haskell Compilation System, version 7.2.1

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

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

当您具有以下格式的代码时,将会出现:

代码语言:javascript
复制
data Ord a => MyType a
    = ConstructorOne a
    | ConstructorTwo a a

我的问题是:为什么这个功能一开始就被弃用了,我应该怎么做才能实现相同或相似的功能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-16 07:46:55

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

“替换”实际上是以另一种方式工作,并为您跟踪已知的上下文,即use GADT-style declarations instead

代码语言:javascript
复制
data MyType a where
    ConstructorOne :: Ord a => a -> MyType a
    ConstructorTwo :: Ord a => a -> a -> MyType a

一般来说,GADT在许多其他方面也更灵活,但对于这种特殊情况,创建一个值需要Ord约束,该约束随后与值一起携带,构造函数上的模式匹配将其拉回。因此,您甚至不需要使用它的函数的上下文,因为您知道,由于期望的是MyType a类型的内容,因此您将获得一个Ord a约束。

票数 105
EN

Stack Overflow用户

发布于 2011-09-16 07:39:09

通常,您仍然需要向使用您的MyType类型的任何函数添加Ord a约束,因此并不像看起来那么有用。有关删除它们的原因的更多信息,请参见http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7438600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档