I have this ADT for representing expressions:
trait Expression {
def value: Int
}
case class Number(value: Int) extends Expression
case class Add(a: Expression, b: Expression) extends Expression {
override def value: Int = a.value + b.value
}
I could add more case class for other operations like "-", "*", etc. Then I could represent "2 + 7 + 9" like this:
val addingThreeNumbers = Add(Number(2), Add(Number(7), Number(9)))
If I want to get the result of addingThreeNumbers I could implement:
def evaluate(e: Expression): Int = {
e match {
case Number(value) => value
case Add(a, b) => evaluate(a) + evaluate(b)
}
}
This implementation works.
But, how can I implement it using tail recursion?