如果两个模块共用同一个名称,我该怎么办?

时间:2017-11-04 12:47:45

标签: haskell

我有两个包提供相同名称的模块。当我尝试加载模块时出现错误

  

....的模糊界面:它在多个包中找到。

我该怎么做才能解决这个问题?

具体而言,cryptonite包和crypto-api包都提供名为Crypto.Random的模块。如何指定我要从哪个软件包加载模块?

2 个答案:

答案 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进行构建。