繁体   English   中英

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

[英]Haskell / GHCi - loading modules from different directories

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

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

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

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

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

ghci Foo.Bar -isrc

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

ghci Bar.hs -i.:config 

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

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

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

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

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

:set -isrc -iutils -isubsystem

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM