compose :: (a → a) → (a → a) → a → a cons :: a → a → a hd :: a → a init :: a → a last :: a → a nil :: a reverse :: a → a reverse2 :: a → a → a tl :: a → a compose(F, Z, U) → Z(F(U)) reverse(V) → reverse2(V, nil) reverse2(nil, W) → W reverse2(cons(X1, Y1), P) → reverse2(Y1, cons(X1, P)) hd(cons(U1, V1)) → U1 tl(cons(W1, P1)) → P1 last → compose(hd, reverse) init → compose(reverse, compose(tl, reverse))