Functional Programming with Effects by Rob Norris