首页 > 解决方案 > Acid-State 示例编译错误。否 (Control.Monad.Reader.Class.MonadReader FailureDb (Query FailureDb)) 没有实例

问题描述

我正在尝试酸示例,但编译错误。

错误消息no instance No instance for MonadState, No instance for MonadReader

本文说这是由于安装了两个不同的 mtl 版本。

我在 nixos 中使用 nix-shell:

ghc-pkg list | grep acid
    acid-state-0.14.3

ghc-pkg list | grep mtl
    mtl-2.2.1
    mtl-2.2.2

但是,如果我在输入 nix-shell 时不使用酸状态包,我会得到:

ghc-pkg list | grep mtl
    mtl-2.2.2

这可能意味着酸状态使用的 mtl 版本与 Control.Monad.Reader 不同。

但是acid-state在github中的stack.yaml是lts-11.15,里面有mtl-2.2.2。

那么我应该怎么做才能让它工作呢?

标签: haskellnixnixos

解决方案


Stack 和 Cabal-install 在处理 GHC 的包 dbs 时有类似的问题,但是这些问题是可以避免的:

当我使用 Stack 时,我不在 nix-shell 中运行它,因此 nix-shell 无法将包添加到包装的 GHC 命令中,然后 Stack 将其视为系统包(Cabal 术语中的“全局”) . 我不确定这是否是唯一有效的方法。

仅 Cabal 安装

在 nix-shell 中调用 Cabal 时,您应该添加这些标志以防止 GHC 查看错误的包 db: cabal configure --package-db=clear --package-db=global。GHC 包装器将使 Nix 管理的依赖项出现在“全局”包 db 中。


推荐阅读