abstract class Expr { def eval: Int = this match { case Number(n) => n case Sum(e1, e2) => e1.eval + e2.eval } def printExpr: Unit = this match { case Number(n) => print(n) case Sum(e1, e2) => print("(") ; e1.printExpr ; print("+") ; e2.printExpr ; print(")") } } case class Number(n: Int) extends Expr case class Sum(e1: Expr, e2: Expr) extends Expr /* Case classes do a lot automatically * - implicit constructor function * def Number(n: Int) = new Number(n) * - proper toString, value-type equals and hashCode * - accessor for argument * def n: Int * - allows for "Patterns" in match function: */ /* def eval(e: Expr): Int = e match { case Number(n) => n case Sum(l, r) => eval(l) + eval(r) } */