append1 :: [a] -> [a] -> [a] append1 [] l = l append1 (h : t) l = h : (append1 t l) app :: [a] -> [a] -> ([a] -> [a]) -> [a] app [] l k = k l app (h : t) l k = app t l (\l' -> k (h : l')) append2 :: [a] -> [a] -> [a] append2 l1 l2 = app l1 l2 (\l -> l)