たとえば、プログラミング言語のパーザを書いていて、プログラムの木構造を次のように表現したいとします。 sealed trait Expression case class Addition(lhs: Expression, rhs: Expression) extends Expression case class Subtraction(lhs: Expression, rhs: Expression) extends Expression case class Multiplication(lhs: Expression, rhs: Expression) extends Expression case class Division(lhs: Expression, rhs: Expression) extends Expression case class Number(value: