从 GHCi 中隐藏随机版本

Hiding versions of random from GHCi

我正在使用 newsynth 软件包并 运行 遇到了一个错误,我开始怀疑这个错误与夏季更新 random-1.2.0 有关(newsynth 上次更新是在 2019 年底,random-1.2.0 是在 6 月出来的。从那以后我就有了 运行 cabal update,这就是为什么这两个似乎都安装了。)这是代码我在 GHCi 中 运行:

 λ> import System.Random
 λ> import Quantum.Synthesis.Ring
 λ> import Quantum.Synthesis.Diophantine
 λ> g <- getStdGen
 λ> diophantine g (RootTwo 5 0)

<interactive>:5:1: error:
    • No instance for (random-1.1:System.Random.RandomGen StdGen)
        arising from a use of ‘diophantine’
      There are instances for similar types:
        instance random-1.1:System.Random.RandomGen
                   random-1.1:System.Random.StdGen
          -- Defined in ‘random-1.1:System.Random’
    • In the expression: diophantine g (RootTwo 5 0)
      In an equation for ‘it’: it = diophantine g (RootTwo 5 0)

正如在另一个 SO post 中向我建议的那样,我尝试从 GHCi 中隐藏 random 的另一个副本。我运行

$ ghc-pkg --global --package-db ~/.cabal/store/ghc-8.8.3/package.db list random
~/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/package.conf.d
    (no packages)
~/.cabal/store/ghc-8.8.3/package.db
    random-1.1
    random-1.2.0

所以我尝试了 $ ghc-pkg --global --package-db ~/.cabal/store/ghc-8.8.3/package.db hide random-1.2.0。 然而,当错误仍然存​​在时,我也尝试了 $ ghc-pkg --global --package-db ~/.cabal/store/ghc-8.8.3/package.db hide random-1.1 (只是为了确保 hide 做了我想做的事),但莫名其妙地发现在 GHCi 中(即使在重新启动终端后)我能够 运行 λ> import System.Random 尽管所有已知的 random 实例都被隐藏了。我是不是以错误的方式隐藏包裹?

提前谢谢你。


(前几天我问了一个有点相关的问题,但由于我认为这个问题有点不同,所以我认为将其分开是有意义的。如果不是这种情况,我可以更新另一个 post。)

当你想管理包时使用 cabal 或 stack。但首先,重置为干净状态:

rm -rf ~/.ghc ~/.cabal
cabal update
cabal v2-repl -b newsynth

这将使您进入 GHCi 会话并获得所需的包。

我想直接在 ghci 中工作而不通过 cabal replstack ghci,一种方法是创建一个 local GHC package environment in a folder, using cabal-install :

cabal install --lib --constraint="random == 1.1" --package-env .  random

除了“随机”本身,您还需要明确列出您希望出现在环境中的其他包。同样,您可以添加多个 --constraint 个参数。

这将在文件夹中创建一个名为“.ghc.environment.xxx”的文件,该文件应由在那里进行的独立 ghci 或 ghc 调用获取。