On Fri, Aug 15, 2008 at 03:09:16PM +0200, Sean Leather wrote:
> Ross Paterson wrote:
> With implicit import, it just doesn't work to have different instances in
> different places. Suppose two modules use your library in the different
> ways you envisage. Then those modules cannot be used together in the
> same program. Your library will not be re-usable.
>
> It is not true that those modules cannot be used in the same program. It is
> possibly true that they cannot both be imported by another module. (It depends
> on how the instances are used.)
If they're in the same program, there will be chains of imports from Main
to each of them, so Main will implicitly import conflicting instances and
will be rejected by the compiler.
module A where
class A t where
a :: t
module B where
import A
instance A Int where
a = 0
a0 :: Int
a0 = a
module C where
import A
instance A Int where
a = 1
a1 :: Int
a1 = a
module Main where
import A
import B
import C
main = do putStrLn $ "a0=" ++ show a0
putStrLn $ "a1=" ++ show a1
This works, because of the way the instances are used. While overlapping instances are imported into Main, they are not used in Main.
Sean