Type-class instances for types with 2 parameters when the type-class has only one

Viewed 361

Consider the following type-class:

class Listable a where
   asList :: a t -> [t]

It's easy enough to create instances for types with one parameter:

instance Listable [] where
   asList = id

instance Listable Maybe where
   asList (Just x) = [x]
   asList Nothing = []

Now how would I make an instance for a pair with two identical type parameters? Of course I could do some wrapping:

data V2 a = V2 a a

v2 (p,q) = V2 p q

instance Listable V2 where
   asList (V2 p q) = [p,q]

Now I could write things like asList $ v2 (47, 11), but this kind of defeats the purpose.

Is there a way to limit the type of pair to cases where both type parameters are equal, and to write a Listable instance for that? If not, what is the usual workaround?

2 Answers
Related