Acid-State 示例编译错误。没有实例 (Control.Monad.Reader.Class.MonadReader FailureDb (Query FailureDb))

Acid-State example compiled error. No No instance for (Control.Monad.Reader.Class.MonadReader FailureDb (Query FailureDb))

我正在尝试 acid example 但编译错误。

The error message 表示 no instance No instance for MonadState, No instance for MonadReader

This article 说这是因为安装了两个不同的 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时不使用acid-state包,我得到:

ghc-pkg list | grep mtl
    mtl-2.2.2

这可能意味着 acid-state 使用的 mtl 版本不同于 Control.Monad.Reader。

但是github中酸态的stack.yaml是lts-11.15,它有mtl-2.2.2.

那么我应该怎么做才能让它发挥作用?

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

堆栈

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

仅限 Cabal 安装

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