28

我无法在 Haskell 中编译这行代码,但它适用于我教授的系统。我使用 ghci 版本 7.6.2。

data Eq a => Shape a = Shape a

更准确地说,这是我得到的错误

[1 of 1] Compiling Main             ( test.hs, interpreted )

test.hs:1:6:
Illegal datatype context (use -XDatatypeContexts): Eq a =>
Failed, modules loaded: none.

这里有什么错误?

谢谢

4

3 回答 3

38

您的教授可能使用的是旧版本的 GHC。您发布的行使用了最近被删除的功能。可能的解决方案是:

  1. 删除Eq a =>并写入data Shape a = Shape a.

  2. 正如 GHC 所说,提供-XDatatypeContexts标志以重新启用已删除的功能。

更详细地说:Eq a =>类型声明的部分称为数据类型上下文。它唯一的功能是限制Shape构造函数的类型,这样Shape :: a -> Shape a你就可以得到Shape :: Eq a => a -> Shape a. 它不会使您不必编写Eq a涉及Shapes 的类型签名,甚至在您不需要时甚至会要求您编写它们。当数据类型中的严格字段需要类约束时,它曾经很有用,但该功能很久以前就被删除了。

简而言之,仅删除上下文几乎总是对您的程序的改进,因此它们已从 Haskell 2011 语言标准中删除。自 GHC 7.0.1 以来,有一个关闭它们的选项,自 7.2.1 以来,它一直是默认设置。

于 2013-09-21T16:34:13.453 回答
7

我认为错误信息的内容很清楚。你需要一个扩展。

{-# LANGUAGE DatatypeContexts #-}
data Eq a => Foo a = Foo a

虽然这个扩展过去是默认开启的,但从 ghc 7.6 开始,它的使用被认为已被弃用,并将在未来被删除。所以你的教授可能使用的是旧版本的 ghc。

于 2013-09-21T16:26:43.223 回答
3

另请参阅https://stackoverflow.com/a/22622591/2008899,其中解释了“为什么?” 语言更改的背后,以及显示数据类型上下文应该提供的 GADT 示例。

于 2014-03-25T15:30:46.987 回答