user668074
user668074

Reputation: 1131

What should I do if two modules share the same name?

I have two packages that provide modules with the same name. When I try to load the module I get an error

Ambiguous interface for ....: It was found in multiple packages.

What should I do to resolve this?

To be specific, both the cryptonite package and crypto-api package provide modules with the name Crypto.Random. How can I specify which package I want to load the module from?

Upvotes: 9

Views: 1878

Answers (2)

danidiaz
danidiaz

Reputation: 27771

If you happen to be using ghc >= 8.2 and cabal-install >= 2.0, another option is renaming the conflicting modules in the mixins section of the cabal file:

  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)

You can then import the renamed modules:

module Main where

import CryptoniteCrypto.Random
import CryptoAPICrypto.Random

One thing to take into account when renaming this way is that modules that haven't been explicitly renamed become inaccessible.

In fact, ability to rename modules seems to exist since GHC 7.10, through the -package flag and the reexported-modules cabal section. reexported-modules works at declaration-time (when publishing a package) while mixins works at use-time (when depending on a package).

Upvotes: 13

gallais
gallais

Reputation: 12093

You can use the PackageImports language pragma and explicitly pick the package you mean in your import statement like so:

import "cryptonite" Crypto.Random

Alternatively if you have both installed but are only using one of them, you could explicitly list the dependencies you use in a cabal file and build via cabal.

Upvotes: 13

Related Questions