GHC(Haskell编译器)无法识别已安装的Data.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

