map f = case _ of Nil -> Nil x:xs -> f x : map f xs map2 f g xs = map g (map f xs) ---------- map2 f g xs = map g case xs of Nil -> Nil x:xs -> f x : map f xs ---------- map2 g f xs = case (case ...) ... ---------- map2 f g xs = case xs of Nil -> case Nil of Nil -> Nil x:xs -> f x : map f xs x:xs -> case f x : map f xs of Nil -> Nil x:xs -> g x : map g xs ---------- map2 f g xs = case xs of Nil -> Nil x:xs -> let a = f x b = map f xs in g a : map g b ---------- map2 f g xs = case xs of Nil -> Nil x:xs -> g (f x) : map g (map f xs) ---------- map2 f g = case _ of x:xs -> g (f x) : map2 f g xs Nil -> Nil ---------- map2 f g = case _ of x:xs -> (compose g f) x : map2 f g xs Nil -> Nil ========== Unify map2 f g a with map u1 u2 u2 = a ========== Unify (compose g f) x with u1 x u1 = compose g f ========== Unify map2 f g xs with map (compose g f) xs TRUE map2 = map (compose g f) xs