How to Program It: Solving Problems Functionally Using Haskell
stackbuilders.com