Haskell Cookbook: Build functional applications using Monads, Applicatives, and Functors