[Haskell] How to avoid both duplicate instances and extraneous instance declarations?

Robin Bate Boerop robin_bb at acm.org
Sat Apr 22 12:23:02 EDT 2006

I am having trouble making a type system for my EDSL in Haskell.  Can  
someone help?  A simplified description of my problem follows.

I have three classes, A, B1, and B2.  I want all instances of B1 to  
be instances of A.  I want all instances of B2 to be instances of A.   
None of the classes have methods.

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

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

Of course, this is a simplified example.  In a complicated type class  
hierarchy, in a program with many instances of, say B1, having to  
provide instance declarations for A is laborious.

Is there a way to avoid this?  How can I tell Haskell "all instances  
of B1 are automatically instances of A".

Robin Bate Boerop

More information about the Haskell mailing list