object PatternMatching { trait Expr { def eval: Int = this match { case Number(n) => n case Sum(e1, e2) => e1.eval + e2.eval } def show: String = this match { case Number(n) => n.toString case Sum(e1, e2) => e1.show + " + " + e2.show } } case class Number(n: Int) extends Expr case class Sum(e1: Expr, e2: Expr) extends Expr def eval1(e: Expr): Int = e match { case Number(n) => n case Sum(e1, e2) => eval1(e1) + eval1(e2) } def run = { println("PatternMatching") println( eval1(Sum(Number(1), Number(2))) ) val e = Sum(Number(1), Number(2)) println( e.show + " = " + e.eval ) } }