Thinking Functionally with Haskell
pragprog.com