You want all instances of B1 to be instances of A and all instances of B2 to be instances of A.

This means:



forall a. B1 a => A a

and

forall a. B2 a => A a



I think this is not possible with type-classes and the type class extensions in Haskell, because the compiler can't construct the proofs deterministically anymore. The compiler has two choices, use an instance of B1 to construct a proof for A, or use an instance of B2 to construct a proof for A.



However, if the compiler has to proof (A Int) and there is no instance (B1 Int), but there is an instance (B2 Int). I can imagine that a compiler is smart enough to use (B2 Int) ....




Gerrit


Gerrit,

Thanks for your help. Yes, your suggestion below will allow me to give only an instance declaration for B1 (and get the A declaration for free, if you will).

However, I meant to suggest that there were other T's which are not instances of B1 but of B2. I will be back in the same situation for those T's as I was previously in with T. I can't add

instance B2 a => A a

in addition to

instance B1 a => A a

because of the duplicate instance situation.  So, my problem remains.

--
Robin Bate Boerop



On 22-Apr-06, at 2:01 PM, Gerrit van den Geest wrote:

Robin,

The following does NOT work, because of a duplicate instance declaration for A:

class A a
class B1 b1
class B2 b2
instance B1 x => A x
instance B2 x => A x  -- duplicate instance, won't compile
data T = T
instance B1 T

Yes, this doesn't work and I think there is no GHC extension that supports this.

The following DOES work, but it requires that I explicitly give instance declarations of A for all instances of B1 and B2:

class A a
class A a => B1 a
class A a => B2 a
data T = T
instance A T  -- I don't want to have to specify this!
instance B1 T

If you replace the instance you don't want to specify with:
instance B1 a => A a
and use the following flags to start ghc:
-fglasgow-exts -fallow-undecidable-instances

You can add other datatypes, and you only have to give an instance for class B1.

Good luck!

Gerrit






_______________________________________________
Haskell mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to