假设我获得了一个名为MyModule.hs
的源文件,其中的模块声明为module My.Module where ...
(注意:不是 module MyModule where ...
)。
我不允许更改此源文件或更改文件所在的目录结构。
从阅读some docs about importing modules in GHCi开始,看起来有办法按文件名导入(例如import
或:load
),但没有办法指定将在本地目录的所有文件中搜索的模块名称。
有没有办法在GHCi中导入My.Module
而不通过指定文件的名称(仅模块名称)而不安装它(例如不用cabal
构建它,只是通过模块名称快速将其折腾到GHCi中?
答案 0 :(得分:1)
对于每个目录,它会尝试将basename.extension附加到目录,并检查该文件是否存在。 basename的值是模块名称,其中的点由目录分隔符替换(' /'或' \',具体取决于系统),并且扩展名是源扩展名(hs) ,lhs)...
关键部分是
basename的值是模块名称,其中的点由目录分隔符替换(' /'或' \',具体取决于系统)
因此,My.Module
的模块名称将被搜索为My/Module.hs
。您需要具有类似
project/
My/
Module.hs
project.cabal
从project
文件夹中,您可以运行
$ cabal repl
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.
> import My.Module
如果您的文件名为MyModule.hs
并且您的模块名称为MyModule
,则可以执行此操作,但这只是上述规则的特例。
这有很好的理由,即它强制实施一个简化项目结构的结构和GHC的搜索算法。如果这条规则不合适,会阻止我做什么
project/
MyModule1.hs
MyModule2.hs
哪两个.hs
文件都有模块声明My.Module
?如果我运行import My.Module
,在GHCi中加载哪一个是正确的?通过指定文件名和路径,您可以立即知道模块X.Y.Z.W.Q.R.S.T
位于路径X/Y/Z/W/Q/R/S/T.hs
,无需搜索。它减少了更宽松的模块名称规范可能出现的歧义。