// expression structures as case classes: abstract class Expr case class Num(num: Int) extends Expr case class BinOp(operator: String, left: Expr, right: Expr) extends Expr // compute value of an expression: def expValue(expr: Expr): Int = expr match { case Num(n) => n case BinOp("+",e1,e2) => expValue(e1) + expValue(e2) case BinOp("*",e1,e2) => expValue(e1) * expValue(e2) } val exp = BinOp("+", Num(2), BinOp("*", Num(2), Num(3)))