You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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构建工具(推荐)

如果你的项目会慢慢变大,用构建工具管理是更靠谱的选择:

  1. 先在a/目录下初始化Cabal项目:
    cabal init
    
    跟着提示填写项目信息就行。
  2. 打开生成的.cabal文件,找到executable或者library部分,确保hs-source-dirs包含当前目录:
    hs-source-dirs:     .
    
    这样Cabal会自动扫描a/下的所有子目录(包括b/和c/)来查找模块。
  3. 同样给c.hs加上模块声明(比如module C where),然后在b.hs里直接import C即可。
  4. 之后用cabal build编译,或者cabal run运行项目,Cabal会自动处理模块依赖。

小提示

Haskell的模块名惯例是首字母大写,并且最好和文件名对应(比如C对应c.hs,Utils.Helper对应Utils/Helper.hs),这样能避免很多奇怪的查找问题。

内容的提问来源于stack exchange,提问作者Qwertie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:39:27