class Show (T a) => C a where { type T a; get :: a -> T a; } data D = D; instance Show D where { show _ = "D"; } instance C D where { type T D = D; get _ = D; } instance C Int where { type T Int = Int; get i = i; } instance C a => C (List a) where { type T (List a) = T a; get l = case l of Nil -> error "list empty"; Cons x _ -> get x; ; } data E = E; instance C E where { type T E = Int; get _ = 42; } test1 = show (get D); test2 = show (get (Cons 1 (Cons 2 Nil))); test3 = show (get E); main = test2;