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