28

我的 haskell 应用程序具有以下目录结构:

src/
    utils/Utils.hs
    subsystem/Subsystem.hs

Subsystem模块导入Utils模块。我想在 GHCi 中手动测试这段代码。

问题是 GHCi 似乎只是在寻找'.'(当前目录)中可用的模块,所以我复制Utils.hs到子系统文件夹并能够手动测试Subsytem.hs。有一个更好的方法吗?例如,我想在src目录中启动 GHCi 并让它在./utils./subsystem目录中搜索模块。我可以指定 GHCi 的模块路径吗?

4

4 回答 4

22

-i您可以使用以下选项告诉 GHCi 在哪里搜索模块:

ghci Foo.Bar -isrc

这将加载src/Foo/Bar.hs到 GHCi 中。这样,您还可以像这样指定两个不同的目录:

ghci Bar.hs -i.:config 

它将在 ./ 和 ./config/ 中查找依赖项。

有关模块搜索路径的更多信息,请参阅 GHC 用户指南

于 2011-07-07T06:46:58.603 回答
11

默认情况下,当 GHC 查找模块时,它会解释Foo.BarFoo/Bar.hs. 因此,如果您有一个项目,则可以在顶级目录中拥有一个模块Utils,而在. 请注意,它可以与名为 的目录一起存在,或者两者都可以独立存在。一种常见的风格往往是使用顶级模块来简单地从层次结构中它下面的模块重新导出事物,但这不是必需的。GHC 用户指南涵盖了上述行为,并描述了支持哪些其他选项。Utils.hsUtils.FishcakesUtils/Fishcakes.hsUtils.hsUtils

据我所知,在大多数情况下,代码要么使用上述默认结构,要么使用作为 cabal 构建的一部分指定的其他结构,或者期望作为库安装。

于 2011-07-07T05:17:18.577 回答
10

您可以使用以下内容创建一个 .ghci 文件:

:set -isrc -iutils -isubsystem

于 2011-07-07T15:15:34.623 回答
4

如果您的项目如下所示...

src/
    utils/Utils.hs
    subsystem/Subsystem.hs
.....
myproject.cabal
Setup.hs

.ghci您可以在项目的根目录中创建一个文件,与src,myproject.cabalSetup.hs所在的目录相同。 的内容.gchi应该是这个..

:set -isrc/utils -isrc/subsystem

现在您可以从项目的根目录调用 ghci,它会自动加载任何链接的模块。

$ ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude>:load src/subsystem/Subsystem.hs
... should load Subsystem.hs
于 2014-09-22T01:41:06.197 回答