the exercise for Functional Programming Principles in Scala