How to Think Like a Functional Programmer