GHC 7.4更新中断haskell98?

时间:2012-03-04 14:29:00

标签: haskell ghc

我今天更新了ghc,我的小程序停止了工作:

https://github.com/BrisFunctional/misere-oxo/blob/master/OXO/misere.hs

GHC现在是版本7.4.1-2,从我设法理解它现在默认 到haskell2010标准,而不是haskell98。 (正如我从ghc-pkg列表的输出中看到的那样):

haskell2010-1.1.0.1
(haskell98-2.0.0.1)

所以我将我的“导入列表”更改为“导入Data.List”,我认为这是唯一的问题,但现在我得到以下内容:

 misere.hs:1:1: Not in scope: `System.Environment.withArgs'

这是从哪里来的,因为我从未导入System.Environment? 任何提示? 感谢

编辑: 我更新了github上的版本以反映此错误。并且实际上使用Data.List ghc完美地编译文件,因此runhaskell会产生这个问题..

3 个答案:

答案 0 :(得分:14)

您不仅需要将List更改为Data.List,还需要Random更改为System.Random并从getArgs导入System.Environment(但是此刻,代码既不使用getArgs也不使用System.Random中的任何内容,因此目前您还可以删除这些导入。)

旧的非分层模块只能从haskell98包中访问,该包不再与base兼容。这意味着使用haskell98模块还需要在命令行上显式隐藏base,或者不在base文件的依赖项字段中列出.cabal

我对错误信息感到有些惊讶,我希望它能说出来

Could not find module `System'
It is a  member of the hidden package `haskell98-2.0.0.1'.

但这种差异可能是runhaskell的怪癖。

答案 1 :(得分:6)

如果您的程序是纯Haskell98,您可以使用以下GHC调用:

ghc -package haskell98 -hide-package base

但从长远来看,如果至少升级到分层模块名称会更好。使用Hoogle查找模块的名称。例如,http://www.haskell.org/hoogle/?hoogle=withArgs列出System.Environment作为导出模块。

答案 2 :(得分:2)

首先,我认为您使用System.Environment.withArgs是因为getArgs使用withArgs。 Hackage.Haskell page for System.Environment

尝试导入withArgs,也可以整个System.Environment

其次,可能是List曾经拥有超过Data.List的情况。您可能希望尝试包含整个Prelude,而不仅仅是Data.List

为了回答标题中的问题,GHC的每次更新都扩展了Haskell98。而且一些语言编译器甚至会制定一些Haskell98细节。但是大多数库中的变化都会导致问题,而GHC不会自行更新。

希望我已经给了你足够的解决问题。