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

Gou*_*ham 26 haskell compiler-errors ghci

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

data Eq a => Shape a = Shape a
Run Code Online (Sandbox Code Playgroud)

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

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

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

这里有什么错误?

谢谢

Ben*_*ood 36

你的教授可能正在使用旧版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以来它一直是默认的.


Sat*_*vik 7

我认为错误信息清楚地说明了什么.你需要一个扩展.

{-# LANGUAGE DatatypeContexts #-}
data Eq a => Foo a = Foo a
Run Code Online (Sandbox Code Playgroud)

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