Functional versus imperative programming