Haskell neural库安装及示例运行失败问题求助
问题背景
我想安装并运行Haskell的neural库示例程序,但作为新手搞不清问题出在安装方法、环境还是库本身。尝试stack install neural时,Stack提示无法构建计划,缺少pipes-zlib依赖,按提示添加extra-deps后仍构建失败;改用cabal install neural时,出现重复实例声明错误;安装grenade等相关库也遇到依赖冲突,求指导如何运行示例程序。
场景1:Stack安装neural的依赖缺失与构建失败
错误信息
Error: [S-4804]
Stack failed to construct a build plan.构建计划时,Stack遇到以下错误。"Stack配置"指快照指定的包版本集合(包含移除的包或修剪后的GHC引导包;若替换引导包,Stack会修剪所有依赖它的其他此类包),以及所有额外依赖: 在neural-0.3.0.1的依赖中: * 需要pipes-zlib,但Stack配置中无匹配版本(最新兼容版本为0.4.4.2)。 因neural是构建目标,所以需要该依赖。 可尝试以下解决方法: * 推荐操作:将以下内容添加到C:\Users\DELL\AppData\Roaming\stack\global-project\stack.yaml的extra-deps中(项目级配置): - pipes-zlib-0.4.4.2@sha256:eabd5aa29a030ecdeade80cfeb1787adc181bcf8fd378cb7b695b2af6cb26af6,1947
添加extra-deps后仍报错:
执行构建计划时,Stack遇到错误:
[S-7011] 使用以下命令构建neural-0.3.0.1包时出错(可向上滚动查看对应错误信息): C:\Users\DELL\AppData\Roaming\stack\setup-exe-cache\x86_64-windows\Cabal-simple_9p6GVs8J_3.10.1.0_ghc-9.6.4.exe --verbose=1 --builddir=.stack-work\dist\ab060f89 build --ghc-options " -fdiagnostics-color=always" 进程退出码:ExitFailure 1
解决方法
neural-0.3.0.1是旧版本,与GHC 9.6.4这类新版编译器兼容性差,优先选择匹配的旧版GHC快照:- 新建本地项目目录,进入后运行:
(该快照对应GHC 8.10.7,与neural-0.3.0.1的依赖完全兼容)stack init --resolver lts-18.28 - 打开项目根目录的
stack.yaml,添加指定的extra-deps:extra-deps: - pipes-zlib-0.4.4.2@sha256:eabd5aa29a030ecdeade80cfeb1787adc181bcf8fd378cb7b695b2af6cb26af6,1947 - 执行构建命令:
stack build neural - 运行示例程序(以
sqrt示例为例):stack exec sqrt
- 新建本地项目目录,进入后运行:
场景2:Cabal安装neural的重复实例声明错误
错误信息
构建neural-0.3.0.1失败。
构建日志路径:
C:\cabal\logs\ghc-9.4.8\neural-0.3.0.1-41d9f5ecd7dfa38845ecaf8f9f447447e7958da2.log预处理neural-0.3.0.1库..
构建neural-0.3.0.1库..
[ 1 of 22] 编译Data.MyPrelude ( src\Data\MyPrelude.hs, dist\build\Data\MyPrelude.o )src\Data\MyPrelude.hs:55:1: 警告:[-Wunused-imports]
Data.Monoid的导入是冗余的
除非只是为了导入Data.Monoid中的实例
若仅导入实例,使用:import Data.Monoid()
|
55 | import Data.Monoid ((<>))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[ 2 of 22] 编译Data.FixedSize.Class ( src\Data\FixedSize\Class.hs, dist\build\Data\FixedSize\Class.o ).........
|
120 | vtail (Vector v) = Vector $ VS.tail v
| ^
[17 of 22] 编译Numeric.Neural.Model ( src\Numeric\Neural\Model.hs, dist\build\Numeric\Neural\Model.o )src\Numeric\Neural\Model.hs:139:10: 错误:
重复实例声明:
instance (NFData (s a), NFData (t a)) => NFData (Product s t a)
-- 定义于src\Numeric\Neural\Model.hs:139:10
instance [safe] (Control.DeepSeq.NFData1 f,
Control.DeepSeq.NFData1 g, NFData a) =>
NFData (Product f g a)
-- 定义于Control.DeepSeq
|
139 | instance (NFData (s a), NFData (t a)) => NFData (Product s t a) where
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: cabal-3.10.2.1.exe: 构建neural-0.3.0.1失败(neural-0.3.0.1的exe:sqrt、exe:sin等目标依赖此包)。详情见上方构建日志。
解决方法
- 错误根源是新版
deepseq库已为Product类型提供了NFData实例,而旧版neural重复声明导致冲突,解决步骤:- 新建Cabal项目:
cabal init --non-interactive - 在项目根目录创建
cabal.project文件,添加版本约束:
(deepseq从1.4.5.0版本开始新增了Product的NFData实例,约束低于该版本即可避免冲突)constraints: deepseq < 1.4.5.0 - 执行安装命令:
cabal install neural
- 新建Cabal项目:
场景3:安装Grenade的依赖冲突
错误信息
失败(回溯法,冲突集合:singletons, template-haskell, th-desugar)
遍历整个依赖树后,最难满足的目标是:grenade, text, singletons, template-haskell, th-desugar, base
解决方法
- Grenade的依赖冲突多因新版GHC与
singletons、th-desugar等依赖包版本不匹配,解决步骤:- 选择与Grenade版本兼容的Stack快照,例如Grenade稳定版支持GHC 9.2.x,执行:
(该快照对应GHC 9.2.8,与Grenade的依赖兼容)stack init --resolver lts-20.25 - 执行构建命令:
stack build grenade - 若仍有冲突,在
stack.yaml的extra-deps中添加冲突包的兼容版本,例如根据错误提示指定singletons和th-desugar的具体版本。
- 选择与Grenade版本兼容的Stack快照,例如Grenade稳定版支持GHC 9.2.x,执行:
总结
新手遇到这类Haskell库依赖问题,核心原因大多是旧库与新版GHC/依赖包不兼容。优先选择和目标库版本匹配的旧版GHC快照(Stack的LTS快照),尽量使用本地项目而非全局安装,避免污染全局环境。
内容的提问来源于stack exchange,提问作者college-account

