我有两个包提供相同名称的模块。当我尝试加载模块时出现错误
....的模糊界面:它在多个包中找到。
我该怎么做才能解决这个问题?
具体而言,cryptonite
包和crypto-api
包都提供名为Crypto.Random
的模块。如何指定我要从哪个软件包加载模块?
答案 0 :(得分:9)
如果您正好使用 ghc> = 8.2 和 cabal-install> = 2.0 ,则另一个选项是重命名{{3}中的冲突模块cabal文件的部分:
build-depends: base >=4.10 && <4.11,
cryptonite >= 0.24,
crypto-api >= 0.13.2
mixins:
cryptonite (Crypto.Random as CryptoniteCrypto.Random),
crypto-api (Crypto.Random as CryptoAPICrypto.Random)
然后,您可以导入重命名的模块:
module Main where
import CryptoniteCrypto.Random
import CryptoAPICrypto.Random
以这种方式重命名时要考虑的一件事是未明确重命名的模块变得无法访问。
事实上,能够通过mixins
标志和 reexported-modules cabal部分重命名模块seems to exist since GHC 7.10。 reexported-modules 在声明时(发布包时)工作,而 mixins 在使用时工作(取决于包)。
答案 1 :(得分:7)
您可以使用PackageImports
语言编译指示,并在导入语句中明确选择您的意思包,如下所示:
import "cryptonite" Crypto.Random
或者,如果您已安装两者,但仅使用其中一个,则可以在cabal
文件中明确列出您使用的依赖关系,并通过cabal
进行构建。