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

GHC可编译的简单Haskell项目,Cabal构建失败求助

解决Cabal构建Haskell项目时找不到本地模块的问题

问题背景

现有Haskell项目的src目录下包含Address.hs、Person.hs和Main.hs,使用ghc src/*.hs可以正常编译链接,但通过cabal init --source-dir=src --main-is=src/Main.hs初始化项目后,执行cabal build时出现模块找不到的错误:

src/Main.hs:1:1: error:
    Could not find module ‘Person’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
1 | import Person
  | ^^^^^^^^^^^^^

src/Main.hs:2:1: error:
    Could not find module ‘Address’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
2 | import Address
  | ^^^^^^^^^^^^^^

原因分析

ghc src/*.hs会一次性编译并链接指定目录下的所有Haskell源文件,而Cabal是基于包配置的构建工具——默认情况下,cabal init只会将你指定的Main.hs纳入可执行文件的构建范围,不会自动识别同目录下的其他本地模块,必须显式声明这些模块属于当前包的一部分。

解决步骤

  • 打开项目根目录下生成的.cabal配置文件(文件名通常与项目名一致,比如my-project.cabal)
  • 找到executable代码块(块名与项目名相同),示例如下:
    executable my-project
      main-is:             Main.hs
      -- other-modules:
      -- other-extensions:
      build-depends:       base ^>=4.18.1.0
      hs-source-dirs:      src
      default-language:    Haskell2010
    
  • 取消-- other-modules:的注释,并添加你的本地模块:
    other-modules:       Address
                          Person
    
  • 保存配置文件后,重新执行cabal build即可正常编译。

补充说明

如果后续项目新增更多本地模块,只需将它们添加到other-modules列表中即可。若项目规模较大,也可以将公共模块拆分到library块中,再让executable依赖这个库,这样项目结构会更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:05:18