Effective Haskell : Solving Real-World Problems with Strongly Typed Functional Programming