How to Think Like a (Functional) Programmer