Haskell模块导入路径导航:如何从b.hs导入上级目录的c.hs?
在Haskell中跨目录导入模块的方法
首先先确认下你的目录结构是不是这样:
a/ ├─ a.hs ├─ b/ │ └─ b.hs └─ c/ └─ c.hs
Haskell的模块导入是基于模块名而非直接文件路径的,所以不能直接写import "../c/c.hs",得通过下面几种方式来实现:
1. 临时测试:用GHC/GHCi的-i参数指定包含目录
如果你只是快速测试,不想用构建工具,可以在编译或运行时告诉GHC要搜索的父目录:
- 当你在
b/目录下时,运行GHCi:ghci -i../ b.hs - 或者编译
b.hs:ghc -i../ b.hs
这里的-i../表示把上级目录(也就是a/目录)加入GHC的模块搜索路径。
接下来需要给c.hs添加模块声明(这是Haskell的规范),在c.hs的最顶部写:
module C where -- 你的c.hs代码
然后在b.hs里就可以直接导入这个模块了:
import C -- 你的b.hs代码
2. 规范项目:使用Cabal/Stack构建工具(推荐)
如果你的项目会慢慢变大,用构建工具管理是更靠谱的选择:
- 先在
a/目录下初始化Cabal项目:
跟着提示填写项目信息就行。cabal init - 打开生成的
.cabal文件,找到executable或者library部分,确保hs-source-dirs包含当前目录:
这样Cabal会自动扫描hs-source-dirs: .a/下的所有子目录(包括b/和c/)来查找模块。 - 同样给
c.hs加上模块声明(比如module C where),然后在b.hs里直接import C即可。 - 之后用
cabal build编译,或者cabal run运行项目,Cabal会自动处理模块依赖。
小提示
Haskell的模块名惯例是首字母大写,并且最好和文件名对应(比如C对应c.hs,Utils.Helper对应Utils/Helper.hs),这样能避免很多奇怪的查找问题。
内容的提问来源于stack exchange,提问作者Qwertie
相关产品推荐
相关产品推荐

