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

  显示原文与译文双语对照的内容
0 0

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

不允许更改这里源文件或者更改文件所在的目录结构。

From reading一些文档关于在 GHCi 导入模块,看起来好像有办法通过文件名 ( 比如 ) 来导入 。 import 或者 :load ),但不是指定将在本地目录的所有文件中搜索的模块名称的任何方法。

如果没有指定文件( 只有模块名称)的名称,也没有安装它( 比如 ),则可以在GHCi中导入 My.Module,而不需要。 不是用 cabal 构建它,只是用模块名快速将它转入 GHCi?

时间: 原作者:

0 0

你不能按照文档的格式,在名称中包含点。

对于这些目录,它尝试将 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,但这只是上述规则的一个特殊情况,不能执行这里操作。

这有很好的原因,即它强制了一个结构来简化你的项目结构并搜索rtc算法。 如果没有这个规则,什么会阻止我


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 中,不需要搜索。 它减少了松散模块名称规范中可能出现的大量歧义。

原作者:
...