Rebecca Skinner Effective Haskell: Solving Real-World Problems With Strongly Typed Functional Programming