从 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 repl
或 stack 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 调用获取。
我正在使用 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 repl
或 stack 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 调用获取。