Can anyone tell me why the following doesn't work (and what I have to do to fix it)? I thought by specifying the type of coalw as rank-2 would allow it to be used both at a and (a,b). Dominic. Reading file "Test.hs":tten Type checking ERROR "Test.hs":18 - Inferred type is not general enough *** Expression : \(w1,w2) -> coalw w1 ++ coalw w2 *** Expected type : a -> [b] *** Inferred type : (a,b) -> [c] data Vector_ v w = Zero v | Even (Vector_ v (w,w)) | Odd (Vector_ (v,w) (w,w)) deriving Show vzero = Zero () vone = Odd (Zero ((),'a')) vtwo = Even (Odd (Zero ((),('a','b')))) vthree = Odd (Odd (Zero (((),'a'),('b','c')))) vfour = Even (Even (Odd (Zero ((),(('a','b'),('c','d')))))) coal_ :: (forall a b. a -> [b]) -> (forall c d. c -> [d]) -> Vector_ v w -> [w] coal_ coalv coalw (Zero v) = coalv v coal_ coalv coalw (Even v) = coal_ coalv (\(w1,w2) -> (coalw w1) ++ (coalw w2)) v coal_ coalv coalw (Odd v) = coal_ (\(v,w) -> (coalv v) ++ (coalw w)) (\(w1,w2) -> (coalw w1) ++ (coalw w2)) v