Packages and modules
Chris Kuklewicz
haskell at list.mightyreason.com
Fri Jul 7 03:44:50 EDT 2006
seth at cql.com wrote:
>> "Simon Peyton-Jones" <simonpj at microsoft.com> 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 Old.foo and Old.bar now resolve to
A.foo and B.bar.
I expect the pattern for the above would actually be closer to
> import Old(T1,T2) from "original"
>
> mine :: Old.T1 -> Old.T2
becoming
> 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.
--
Chris
More information about the Glasgow-haskell-users
mailing list