我无法在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.
这里的错误是什么?
由于
答案 0 :(得分:35)
您的教授可能正在使用较旧版本的GHC。您发布的行使用的功能最近已被删除。可能的解决方案是:
删除Eq a =>
并撰写data Shape a = Shape a
。
正如GHC所说,请提供-XDatatypeContexts
标记以重新启用已删除的功能。
更详细:类型声明的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示例,该示例执行假设提供的数据类型上下文。