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

use*_*074 8 haskell

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

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

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

具体而言,cryptonite包和crypto-api包都为模块提供了名称Crypto.Random.如何指定要从中加载模块的包?

dan*_*iaz 11

如果您恰好使用ghc> = 8.2cabal-install> = 2.0,则另一个选项是重命名mixinscabal文件部分中的冲突模块:

  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)
Run Code Online (Sandbox Code Playgroud)

然后,您可以导入重命名的模块:

module Main where

import CryptoniteCrypto.Random
import CryptoAPICrypto.Random
Run Code Online (Sandbox Code Playgroud)

在重命名这种方式时要考虑的一件事是未明确重命名的模块变得不可访问.

实际上,GHC 7.10开始,通过-package标志和reexported-modules cabal部分,似乎存在重命名模块的能力.reexported-modules在声明时工作(发布包时),而mixins在使用时工作(当依赖于包时).


gal*_*ais 9

您可以使用PackageImports语言编译指示,并在导入语句中明确选择您的意思包,如下所示:

import "cryptonite" Crypto.Random
Run Code Online (Sandbox Code Playgroud)

或者,如果您已安装但仅使用其中一个,则可以明确列出您在cabal文件中使用的依赖项并通过构建cabal.