如何设置Cabal模块搜索路径以识别本地安装的新版network包
问题1:Cabal无法识别本地已安装的新版network包的解决方法
- 首先补装新版network为共享库,之前安装时如果没有加
--lib参数,Cabal不会将其暴露给其他项目作为依赖库使用,执行命令:cabal install --lib network-3.1.2.5 - 在Monky项目根目录新建
cabal.project文件(如果已有则直接修改),添加以下内容强制指定network版本约束:packages: . constraints: network >=3.1.1 - 编译项目时添加参数禁用系统全局包优先,避免优先调用Gentoo系统安装的旧版network:
cabal build --package-env=default --no-global-packages - 验证配置生效:在项目根目录执行
cabal list --installed --project-file=cabal.project network,可看到3.1.2.5版本已经出现在已安装列表中。
问题2:修改条件编译代码后的类型报错解决方法
报错的原因是旧版network 3.0.1.1中fdSocket本身的返回类型就是IO Foreign.C.Types.CInt,你写的pure . Fd $ fdSocket s相当于给已经是IO类型的返回值额外套了一层pure,导致类型变为IO (IO Foreign.C.Types.CInt),和预期的IO Fd不匹配。
直接修改条件分支代码为以下内容即可:
#if MIN_VERSION_network(3,1,1) Fd <$> unsafeFdSocket s #else Fd <$> fdSocket s #endif
两个分支的返回类型统一为IO Fd,即可正常编译。
内容的提问来源于stack exchange,提问作者bertramscharpf
相关产品推荐
相关产品推荐

