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

GHC(Haskell编译器)无法识别已安装的Data.Vector模块及包数据库配置疑问

解决GHC找不到Cabal Store中安装的Vector模块问题

一、为什么默认GHC找不到你的Vector模块?

从Cabal 3.0版本开始,默认采用store模式安装包——这种模式会把包安装到$HOME/.cabal/store下的隔离目录中,并用单个文件形式的包数据库(package.db)来索引这些包。而GHC默认搜索的包数据库是:

  • 系统级的目录式数据库:/usr/local/lib/ghc-9.2.1/lib/package.conf.d(目录内包含多个单个包的.conf配置文件)
  • 用户级的传统目录式数据库:比如~/.ghc/ghc-9.2.1/package.conf.d

GHC默认不会自动搜索Cabal Store里的单个文件数据库,所以直接运行ghc prob214ff.hs会找不到Data.Vector模块。

二、用GHC_PACKAGE_PATH环境变量解决问题

你可以通过设置这个环境变量,让GHC把Cabal Store的包数据库加入搜索路径:

临时生效(当前shell会话)

在bash/zsh中执行:

export GHC_PACKAGE_PATH="$HOME/.cabal/store/ghc-9.2.1/package.db:$GHC_PACKAGE_PATH"

设置完成后,直接运行ghc prob214ff.hs就能正常找到模块了。

持久生效(每次打开shell自动加载)

把上面的命令添加到你的shell配置文件中:

  • bash:编辑~/.bashrc
  • zsh:编辑~/.zshrc
  • fish:执行set -Ux GHC_PACKAGE_PATH "$HOME/.cabal/store/ghc-9.2.1/package.db" $GHC_PACKAGE_PATH

添加后重启shell,或者执行source ~/.bashrc(对应你的配置文件)即可生效。

三、关于package.db和package.conf.d的困惑

GHC用户指南提到的package.conf.d是传统的目录式包数据库,里面每个包对应一个单独的.conf配置文件,这是早期GHC和Cabal使用的格式。

而Cabal Store使用的package.db是单个文件形式的包数据库——这是GHC从8.0版本开始支持的新格式,更适合隔离、缓存的场景。这两种都是合法的包数据库类型,只是存储形式不同,你不需要找对应的package.conf.d目录,因为Store模式根本不会生成它。

四、更省心的替代方案:用cabal exec

如果你不想手动配置环境变量,可以直接用Cabal的exec命令运行GHC,它会自动帮你设置好所有必要的环境变量(包括GHC_PACKAGE_PATH):

cabal exec ghc -- prob214ff.hs

这种方式更可靠,尤其是切换不同GHC版本或项目依赖时,Cabal会自动匹配对应的包数据库。

五、验证配置是否生效

设置好GHC_PACKAGE_PATH后,运行ghc-pkg list,你应该能看到primitive-0.7.3.0和vector-0.12.3.1出现在输出中,不需要再加-f参数了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:47:44