当模块名称与文件名不匹配时,按模块名称在GHCi中加载模块

时间:2015-01-28 13:18:18

标签: haskell import module ghci

假设我获得了一个名为MyModule.hs的源文件,其中的模块声明为module My.Module where ...(注意:不是 module MyModule where ...)。

我不允许更改此源文件或更改文件所在的目录结构。

从阅读some docs about importing modules in GHCi开始,看起来有办法按文件名导入(例如import:load),但没有办法指定将在本地目录的所有文件中搜索的模块名称。

有没有办法在GHCi中导入My.Module而不通过指定文件的名称(仅模块名称)而不安装它(例如不用cabal构建它,只是通过模块名称快速将其折腾到GHCi中?

1 个答案:

答案 0 :(得分:1)

根据documentation

,您无法在名称中包含点
  

对于每个目录,它会尝试将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,无需搜索。它减少了更宽松的模块名称规范可能出现的歧义。