Functional Programming in Scala by Paul Chiusano