我今天更新了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产生了这个问题。
发布于 2012-03-04 15:10:41
您不仅需要将List
更改为Data.List
,还需要将Random
更改为System.Random
并从System.Environment
导入getArgs
(但目前,代码既不使用getArgs
,也不使用System.Random
中的任何内容,因此暂时还可以删除这些导入)。
旧的非分层模块只能从与base
不再兼容的haskell98
包中访问。这意味着使用haskell98
模块还需要显式地在命令行中隐藏base
,或者不在.cabal
文件的依赖项字段中列出base
。
我对错误消息感到有点惊讶,我希望它会这样说
Could not find module `System'
It is a member of the hidden package `haskell98-2.0.0.1'.
但这种不同可能是runhaskell
的一个怪癖。
发布于 2012-03-04 18:04:32
如果你的程序是纯Haskell98的,你可以使用下面的GHC调用:
ghc -package haskell98 -hide-package base
不过,从长远来看,如果您至少升级到分层模块名称会更好。使用Hoogle找出模块的名称。例如,http://www.haskell.org/hoogle/?hoogle=withArgs
将System.Environment
列为导出模块。
发布于 2012-03-04 14:38:17
首先,我认为您使用System.Environment.withArgs是因为getArgs使用了withArgs。Hackage.Haskell page for System.Environment
也可以尝试导入withArgs
,也可以导入整个System.Environment
。
其次,可能是List
过去比Data.List
现在拥有更多的东西。您可能希望尝试包含整个Prelude
,而不仅仅是Data.List
。
为了回答标题中的问题,GHC的每次更新都扩展了Haskell98。一些语言杂注甚至阻碍了一些Haskell98的细节。但大多数情况下,库中的更改会导致问题,而不是GHC更新本身。
希望我已经给了你足够的东西来解决问题。
https://stackoverflow.com/questions/9555671
复制