abstract class Expression case class Number(i: Int) extends Expression case class Add(x: Expression, y: Expression) extends Expression case class Multiply(x: Expression, y: Expression) extends Expression case class Variable(id: Symbol) extends Expression object Maths extends App { val environment = Map('a -> 1, 'b -> 2, 'c -> 3) def evaluate(env: Map[Symbol, Int], exp: Expression): Int = exp match { case Number(n: Int) => n case Add(x, y) => evaluate(env, x) + evaluate(env, y) case Multiply(x, y) => evaluate(env, x) * evaluate(env, y) case Variable(id: Symbol) => env(id) } val expressionTree1 = Add(Variable('a), Multiply(Number(2), Variable('b))) println(evaluate(environment, expressionTree1)) }