我今天更新了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会产生这个问题..
答案 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不会自行更新。
希望我已经给了你足够的解决问题。