views:

66

answers:

2

Today when I tried to compile my code in Geany I got this error

Could not find module `Control.Monad.Reader':
  it was found in multiple packages: monads-fd-0.1.0.1 mtl-1.1.0.2
Compilation failed.

I get the same for the Writer monad; I thought I should remove one of those packages, but I do not want to break other packages, so now what should I do, yesterday everything worked without any problem.

+1  A: 

I encountered a similar problem recently, and it was suggested that I run ghc-pkg hide {x} where '{x}' is the name of one of those packages. It worked in my situation.

Daniel Pratt
+6  A: 

It looks like you have recently installed monads-fd, perhaps as a dependency of something else you installed. Both monads-fd and mtl packages contain the module Control.Monad.Reader, so GHC doesn't know which one to use when you compile some code that imports it. You need to resolve the ambiguity somehow:

  • If you are using GHC or GHCi directly
    • either use a -hide-package <package> flag on the command line to hide one of the packages, or
    • hide the package by default using ghc-pkg hide <package>. You may need to use ghc-pkg --user hide <package> if the package was installed in your home directory (the default on some platforms).
  • You can use Cabal, and say exactly which one of the conflicting packages you depend on using the build-depends field in your .cabal file
Simon Marlow
An addendum: Cabal takes care of itself, so using `ghc-pkg hide` won't affect it. In other words, you won't break `cabal install` that way, which worried me the first time I saw the "just hide the package" advice. By the way--it's great to have you with us on SO, Simon!
camccann