我的haskell应用程序具有以下目录结构:
src/
utils/Utils.hs
subsystem/Subsystem.hs
Subsystem
模块导入Utils
模块。我想在GHCi中手动测试这段代码。
问题是GHCi似乎只寻找'.'
(当前目录)中可用的模块,因此我将Utils.hs
复制到子文件夹并能够手动测试Subsytem.hs
。有一个更好的方法吗?例如,我想在src
目录中启动GHCi,让它在./utils
和./subsystem
目录中搜索模块。我可以指定GHCi的模块路径吗?
答案 0 :(得分:21)
您可以使用-i
选项告诉GHCi在哪里搜索模块:
ghci Foo.Bar -isrc
这会将src/Foo/Bar.hs
加载到GHCi中。这样,您还可以指定两个不同的目录,如下所示:
ghci Bar.hs -i.:config
它将在./和./config/中查找依赖项。
See the GHC user's guide for more information about the module search path
答案 1 :(得分:10)
默认情况下,当GHC查找模块时,它会将Foo.Bar
解释为Foo/Bar.hs
。因此,如果您有一个项目,则顶层目录中的模块Utils
为Utils.hs
,而Utils.Fishcakes
模块为Utils/Fishcakes.hs
。请注意,Utils.hs
可以与名为Utils
的目录一起存在,或者两者都可以独立存在。一种常见的风格倾向于使用顶级模块简单地从层次结构中的下面的模块重新导出内容,但这不是必需的。 GHC User Guide涵盖了上述行为,并描述了支持的其他选项。
据我所知,在大多数情况下,代码将使用上面的默认结构,将使用指定为cabal构建的一部分的其他结构,或者期望作为库安装。
答案 2 :(得分:9)
您可以使用以下内容创建.ghci文件:
:set -isrc -iutils -isubsystem
答案 3 :(得分:4)
如果您的项目如下所示......
src/
utils/Utils.hs
subsystem/Subsystem.hs
.....
myproject.cabal
Setup.hs
您可以在项目的根目录中创建.ghci
文件,该目录与src
,myproject.cabal
和Setup.hs
所在的目录相同。{{1应该是这个..
.gchi
现在您可以从项目的根目录中调用ghci,它将自动加载任何链接的模块。
:set -isrc/utils -isrc/subsystem