Introduction to Functional Programming using Haskell (2nd Edition) - Richard Bird