data N = Z | S N fold :: ... fold z s n = case n of Z -> z S n' -> s (fold z s n') plus = fold ( \ y -> y ) ( \ f -> \ y -> S ( f y ) ) times = fold ( \ y -> Z ) ( \ f y -> plus y ( f y ) )