Packages and modules

Chris Kuklewicz haskell at
Fri Jul 7 03:44:50 EDT 2006

seth at wrote:
>> "Simon Peyton-Jones" <simonpj at> writes:
>>> Brian Hulley wrote:
>>> |   import A.B.C( T1 ) from "foo"
>>> |   import A.B.C( T2 ) from "bar"
>>> |   type S = A.B.C.T1 -> A.B.C.T2
>>> | I'd suggest that the above should give a compiler error that A.B.C is
>>> | ambiguous (as a qualifier), rather than allowing T1 to disambiguate
>>> it,
>>> But that's inconsistent with Haskell 98.
>> FWIW, I agree with Brian that this is not good practice. If it can't
>> be forbidden, I would suggest that compilers emit a warning about it.
> Is there really a case where someone would use that pattern intentionally?
>  I'd vote for making it an error by default.  Perhaps then a flag would be
> available that says "accept dangerous constructs that are legal according
> to Haskell 98".

The Haskell 98 behavior compensates for the case where the module you used to 
import Old (foo,bar) has been split into two new modules, A(foo) and B(bar). 
You can import A as Old and B as Old so that and now resolve to and

I expect the pattern for the above would actually be closer to

 > import Old(T1,T2) from "original"
 > mine :: Old.T1 -> Old.T2


 > import qualified A.B.C(T1) as Old from "foo"
 > import qualified D.E.F(T2) as Old from "bar"
 > mine :: Old.T1 -> Old.T2

Which is a syntax that should be supported.


More information about the Glasgow-haskell-users mailing list