functional core imperative shell
programming in a functional style improves code (not the lambda calculus version).
using pure functions with no mutation reduces moving parts. this in turn simplifies code.
for things that do need mutation, like using disk, network, database etc. we can isolate those to their own package.