我将描述一下目前为止对我有效的解决方法。我尝试了许多不同的方法,但这里只描述成功的尝试。
(顺便说一句:我正在使用Mac OS X 10.6.4,您在不同的系统上可能会得到不同的结果)
- 我从源代码安装了 GHC 6.12.3。构建 GHC 需要保留先前的 GHC。
- 我删除了 /usr/bin 中的符号链接(ghc、ghci、ghc-pkg 和 runhaskell),这些链接指向我之前安装的 Haskell Platform 2010.1.0.1 版本。
- 我使用 cabal-install 的 bootstrap.sh 脚本安装了它。
- 我安装了经过修补的 random 和 haskell98 包的版本。它们的区别仅在于它们的 .cabal 文件
- 将 random 的版本提升到 1.0.0.2.1,并将其对 time 的依赖关系更改为 time == 1.1.*
- 将 haskell98 的版本提升到 1.0.1.1.1
- 我运行了 cabal update 和 cabal upgrade 以查看哪些软件包已过时。我使用 cabal install 安装了那些软件包。我认为这有助于更快地达到稳定状态。(请注意,syb 的安装失败了,而 cabal install parsec 却说没有任何问题,而 cabal upgrade 则说有问题。所以我将这两个软件包保持不变)
我通过在各个阶段之间运行 ghc-pkg check 来验证我的设置是否正确。有时会出现问题,因为某个软件包被重新安装到具有相同版本号的先前版本上,并且依赖于它的软件包需要重新安装。当发生这种情况时,我再次使用 cabal install 安装已损坏的软件包。
我还使用了以下程序来验证我的设置中是否包含具有相同版本的两个软件包:
import Data.List (sort)
import Data.Maybe (fromJust)
import System.IO (hGetContents)
import System.Process (CreateProcess (std_out), StdStream (CreatePipe), createProcess, shell)
main :: IO ()
main = do
pkgListRaw <-
createProcess (shell "ghc-pkg list") { std_out = CreatePipe }
>>= hGetContents . fromJust . sndOfFourTup
let pkgListSorted = sort . filter (not . null) $ lines pkgListRaw
putStrLn .
unlines . map (dropWhile (== ' ') . fst) .
filter (uncurry (==)) . zip pkgListSorted $ tail pkgListSorted
where
sndOfFourTup (_, x, _, _) = x
注:
- 我无法让 Haskell Platform 2010.1.0.1 正常工作。只有在我升级到 GHC 6.12.3 后,事情才对我起作用。具有讽刺意味的是,这与 GHC 的下载页面上的建议相反:
停!
对于大多数用户,我们建议安装 Haskell Platform 而不是 GHC。当前的 Haskell Platform 发布包括最近的 GHC 发布以及一些其他工具(如 cabal)和一个更大的库集合,这些库已知可以一起使用。
这种解决方法可能在未来某个时候也会失效。我猜大概几个月后就会出现问题。像random
这样的核心库将得到更新,然后依赖问题将再次浮出水面。那时我/你将不得不花时间修复我们的设置。也许需要升级到更高版本的GHC。但谁知道,也许会有一个较旧的版本由于Hackage包的更新而变得稳定。当时机成熟时,我将为您更新此问题和答案。(假设其他人也遇到了此问题。至今为止,我已验证Simon Marlow和Peaker也面临此问题)
判断您的Haskell设置是否损坏的方法(如果以下任一情况成立,则设置损坏):
- 什么都不起作用
ghc-pkg check
指示其已损坏
- 上述答案中我放置源代码的简短程序发现您安装了两个完全相同版本的软件包
cabal update
,然后循环执行安装我上面列出的软件包列表,或另一个列表(最好是具有许多依赖项的大型列表)。如果您从未达到稳定状态(循环的每个迭代都重新安装了某些内容),则您的设置已损坏。警告:此步骤可能会破坏您当前运行的Haskell设置。如果您是 maso-curious 或愿意修复损坏后的设置(这可能需要耗费时间)时,请执行此操作。
我想知道您的设置是损坏还是正常工作的。这可以帮助我。例如,如果我们发现GHC 6.10的设置没有问题,我/您就可以在向某人推荐尝试Haskell等语言时建议他们使用这些设置。
我希望这能帮助面临同样或类似问题的其他人。非常感谢Simon Marlow和John!