(a -> a -> b) -> (c -> a) -> c -> c -> b

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
base Data.Function
(*) `on` f = \x y -> f x * f y. Typical usage: Data.List.sortBy (compare `on` fst). Algebraic properties: * (*) `on` id = (*) (if (*) {, const }) * (*) `on` f) `on` g = (*) `on` (f . *  on f . flip on g = flip on (g . >  
gmapQr :: Data a => (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r
base Data.Data
gmapQl :: Data a => (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r
base Data.Data