最新的GHC中反对DatatypeContext:为什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (28)

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

The Glorious Glasgow Haskell Compilation System, version 7.2.1

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

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

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

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

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

提问于
用户回答回答于

它的反对,因为它一个不好的特性,而实际上并没有任何有用的功能!它所做的只是在其他地方强加了一些额外的限制。特别是,当对这种类型进行模式匹配时,将被迫添加一个约束。

实际上以另一种方式工作并为你追踪已知上下文的“替换”是使用GADT风格的声明

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

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

用户回答回答于

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问9 回答
  • 优惠活动秘书

    0 粉丝2 提问8 回答
  • 最爱开车啦

    8 粉丝503 提问7 回答
  • 富有想象力的人

    3 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券