Haskell - 找不到模块(隐藏包)

时间:2013-01-14 20:29:14

标签: haskell module package hidden cabal

我最近安装了适用于Windows的Haskell平台,用于我正在进行的编程课程。它包括GHCi作为编译器和Cabal作为包装系统。我一直在尝试用Cabal安装Craft3e包,因为这是我的教科书使用的练习包,但无济于事。 要安装Craft3e,我只需在命令提示符下输入cabal unpack Craft3e,这将创建目录“\ Craft3e-0.1.0.8”。输入目录后,我输入cabal install --disable-documentation,它会给我以下消息:

Resolving dependencies...
In order, the following would be installed: 
time-1.2.0.5 (new version)
random-1.0.1.1 (reinstall) changes: time-1.4 -> 1.2.0.5
QuickCheck-2.5.1.1 (reinstall)
Craft3e-0.1.0.8 (new package)
cabal: The following packages are likely to be broken b
haskell-platform-2012.4.0.0
Use --force-reinstalls if you want to install anyway.

使用cabal install --disable-documentation --force-reinstalls后,按预期安装。我加载一个模块来测试它:ghci PicturesSVG。这成功加载。但是,一旦我退出GHCi编译器并重新进入它,我就再也无法从Craft3e软件包加载模块了。相反,我收到了消息:

GHCi, version 7.4.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.

<command line>:
    Could not find module `PicturesSVG'
    it is a hidden module in the package `Craft3e-0.1.0.8'
    Use -v to see a list of the files searched for.
 Failed, modules loaded: none.

发生什么事了?当我输入ghc-pkg list时,该包仍会显示。我尝试输入ghc-pkg expose Craft3e-0.1.0.8,但提示符告诉我:

WARNING: cache is out of date: C:/Program Files (x86)/Haskell Platform/2012.4.0.
0\lib\package.conf.d\package.cache
  use 'ghc-pkg recache' to fix.

我已经完成了recache,并重新输入了“expose”命令,但仍然没有结果。

任何解决方案都会非常感激!

3 个答案:

答案 0 :(得分:3)

cabal: The following packages are likely to be broken b
haskell-platform-2012.4.0.0

这是一个非常的坏标志。如果您非常清楚自己所做的事情,那么您应该只使用--force-reinstalls,作为一个新的学习者,您或多或少都不会这样做。 cabal应该更严厉地警告。

问题的根源在于,软件包的依赖关系被指定得过于严格,以至于默认情况下它不能与ghc-7.4或更高版本一起使用,因为它们的time软件包版本大于craft3e的{​​{1}}文件允许。对该问题的正确解决方法是放宽.cabal上的依赖关系(应该由作者完成,但在固定版本处于hackage之前,用户应该编辑time文件到允许.cabal如果他有time-1.4.*,那么可以构建包而无需重新安装任何东西,从而可能破坏已安装的软件包。)

重新安装ghc >= 7.4timerandom可能会破坏许多软件包,从命令行运行QuickCheck以评估损坏情况。也许只需ghc-pkg check ghc-pkg unregister并重新安装time-1.2.0.5random就可以修复它,也许您需要重新安装更多,也许是整个平台。

在以某种方式修复损坏的软件包后,转到QuickCheck目录,编辑Craft3e-0.1.0.8文件,更改行

Craft3e.cabal

time >= 1.1 && < 1.3, 字段中

build-depends

并在那里运行time >= 1.1 && < 1.5,


cabal install --disable-documentation

右。该软件包不会暴露任何模块,因此它所附带的所有模块都是隐藏的(不确定它是否真的有用)。您只能从它们所在的目录加载它们,因为ghci更喜欢将源文件从当前目录(树)加载到包模块。如果从该目录调用ghci,它应该加载该文件。 (或者,您也可以在从另一个目录Could not find module `PicturesSVG' it is a hidden module in the package `Craft3e-0.1.0.8' 调用ghci时指定目录的路径。)

答案 1 :(得分:2)

Craft3e packege doesn't actually expose any modules。 cabal文件似乎主要用于分发和依赖目的,而不是为您提供正确的库接口,因此要加载任何模块,您始终需要明确打开包含它的文件。

答案 2 :(得分:1)

我已更新Craft3e包以考虑新版本的Time。对由此引起的任何问题道歉。