Haskell: Principles, Patterns, and Perspectives