Suppose I have a type: data A a b = A a String b Int and classes class C1 t where c1 :: t a -> (a, Int) class C2 t where c2 :: t a -> (a, String) (the example is not practical, but shows the case). Now, whilst I can say: instance C1 (A a) where c1 (A a s b i) = (b, i) I cannot say: instance C2 (A ...) where c2 (A a s b i) = (a, s) where ... is the missing syntax - for saying that I want to generalize over the first type variable in A, not the second one as in instance C1. Wouldn't it be nice to be able to say, in the place of ..., something like A _ a? Or more generally, to develop some syntax for types like A, to create from A not only: type B = A (Int, Int) -- A (Int, Int) String b Int but also: type B1 = ... -- A a String (Int, Int) Int where again ... is the missing syntax (A _ (Int, Int)? ). If that would be possible, I could ask for even more happiness - to be able to name the order of holes left in a definition, so that (pseudo-syntax): data A a b c = A a b c type C = A _2 _1 Int -- C String Char = A Char String Int -- C String = A _1 String Int -- C = A _2 _1 Int The "normal" definitions can be translated to a new syntax: type D = A Int -- D = A Int _1 _2 It all comes to lambda-expressions on types - type C = \b a -> A a b Int instance C2 (\a -> A a b) where instance C1 (\b -> A a b) where The rule of translation from normal syntax is obvious - if we have data A a1 ... an = A a1 ... an, then A a1 translates to (\a2 ... an -> A a1 ... an) A a1 a2 translates to (\a3 ... an -> A a1 ... an) and so on. It's just a couple of thoughts, perhaps impossible to implement or having some hidden flaws - I do not know. But it really would be helpful sometimes - when dealing with very general types and operations on them. Khaliff TM [EMAIL PROTECTED]