Source: https://www.scala-lang.org/docu/files/TheExpressionProblem.pdf