
Hi, Iteratee [1] library depends on transformers [2]. The latter exposes `Control.Monad.Trans' module. [1] http://hackage.haskell.org/package/iteratee-0.3.1 [2] http://hackage.haskell.org/package/transformers-0.1.4.0 So does mtl [3] which is also installed on my system. [3] http://hackage.haskell.org/package/mtl-1.1.0.2 As a result, I cannot compile a program using Data.Iteratee, unless one of the packages is hidden. $ ghci GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. Prelude> :m + Control.Monad.Trans Could not find module `Control.Monad.Trans': it was found in multiple packages: mtl-1.1.0.2 transformers-0.1.4.0 $ ghci hide transformers-0.1.4.0 Having transformers hidden, I need to copy-paste MonadTrans and MonadIO instances [4] from Data.Iteratee.Base to my code, otherwise I get errors: Prelude> :load "/home/vvv/job/cdr.mscp/Codec/Binary/MSCP.hs" [1 of 1] Compiling Codec.Binary.MSCP ( /home/vvv/job/cdr.mscp/Codec/Binary/MSCP.hs, interpreted ) /home/vvv/job/cdr.mscp/Codec/Binary/MSCP.hs:88:7: Could not deduce (MonadIO (IterateeG [] Word8 m)) from the context (MonadIO m) arising from a use of `liftIO' at /home/vvv/job/cdr.mscp/Codec/Binary/MSCP.hs:88:7-12 Possible fix: add (MonadIO (IterateeG [] Word8 m)) to the context of the type signature for `warn' or add an instance declaration for (MonadIO (IterateeG [] Word8 m)) In the first argument of `(.)', namely `liftIO' In the expression: liftIO . hPutStrLn stderr . ("*WARNING* " ++) In the definition of `warn': warn = liftIO . hPutStrLn stderr . ("*WARNING* " ++) Failed, modules loaded: none. [4] http://bit.ly/1TT37E With MonadTrans & MonadIO instances duplicated, I need to use `-fno-warn-orphans' GHC option in order not to see "orphan instance" warnings. Or I can just update iteratee.cabal and make it depend on mtl instead of transformers: --- iteratee.cabal.orig 2009-11-09 20:40:29.000000000 +0200 +++ iteratee.cabal 2009-11-16 18:32:36.637288144 +0200 @@ -59,7 +59,7 @@ containers >= 0.2 && < 0.4, extensible-exceptions >= 0.1 && < 0.2, haskell98 >= 1 && < 2, - transformers >= 0.1.4 && < 0.2 + mtl >= 1.1 && < 1.2 exposed-modules: Data.Iteratee This allows me to remove Monad{Trans,IO} instances from my code and forget about `-fno-warn-orphans' flag. But now my package cannot claim its dependency on iteratee-0.3.1 any more. Thus, the question is: are there any transformers-specific features iteratee package needs, or can it just go with mtl? * * * I suspect mtl to be more popular... And actual "popularity" can be measured. I'll try to do that using cabal-query [5] tool; it allows to list "reverse dependencies" [6]. [5] http://hackage.haskell.org/package/cabal-query [6] http://hackage.haskell.org/trac/hackage/ticket/576#comment:2 Cheers. -- vvv