Haskell / GHCi - 从不同目录加载模块

28
我的Haskell应用程序具有以下目录结构:
src/
    utils/Utils.hs
    subsystem/Subsystem.hs

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

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


":load dominoes/src/Dominoes.hs" 看起来运行正常。 - Abhijit Sarkar
4个回答

23

11
默认情况下,当 GHC 查找模块时,它将解释 Foo.BarFoo/Bar.hs。因此,如果您只有一个项目,您可以在顶层目录中将模块 Utils 命名为 Utils.hs,将模块 Utils.Fishcakes命名为Utils/Fishcakes.hs。请注意,Utils.hs 可以与名为 Utils 的目录并存,或者两者都可以独立存在。通常的风格是使用顶级模块简单地从子模块中重新导出内容,但这不是必须的。GHC用户指南涵盖了上述行为,并描述了支持的其他选项。GHC 用户指南

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

感谢回复。我通过以下方式解决了这个问题:在src/下创建包含Utils.hs和Subsystem.hs文件的Utils和Subsystem目录,它们包含Utils.Utils和Subsystem.Subsystem模块。然后我可以从src/运行GHCi,然后只需执行:add Subsystem.Subsystem就可以了。 - simon

10
你可以创建一个类似这样的 .ghci 文件:
:set -isrc -iutils -isubsystem

4
如果您的项目看起来像下面这样...
src/
    utils/Utils.hs
    subsystem/Subsystem.hs
.....
myproject.cabal
Setup.hs

你可以在项目根目录下创建一个.ghci 文件,与srcmyproject.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接