Functional Programming Principles in Scala  by Martin Odersky