Haskell代码行没有编译:“非法数据类型上下文”

时间:2013-09-21 16:22:38

标签: haskell compiler-errors ghci

我无法在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.

这里的错误是什么?

由于

3 个答案:

答案 0 :(得分:35)

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

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

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

  3. 更详细:类型声明的Eq a =>部分称为数据类型上下文。它唯一的功能是限制Shape构造函数的类型,以便Shape :: a -> Shape a取代Shape :: Eq a => a -> Shape a而不是Eq a。它不会使您不必在涉及Shape的类型签名中编写{{1}},实际上甚至会要求您在不需要时编写它们。当数据类型中的严格字段需要类约束时,它曾经很有用,但很久以前就删除了该功能。

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

答案 1 :(得分:6)

我认为错误信息的内容很明确。你需要一个扩展名。

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

虽然此扩展程序默认情况下已启用但从ghc 7.6开始,但其用法被视为deprecated,将来会被删除。因此,您的教授可能正在使用旧版本的ghc。

答案 2 :(得分:3)

另见https://stackoverflow.com/a/22622591/2008899,其中解释了“为什么?”语言变化背后,以及显示GADT示例,该示例执行假设提供的数据类型上下文。