Martin Odersky の CourseRa Scala コースに示されている例を実現して、適切な括弧を使用して Sums/Prods を保持する式を表示しようとしています。私は以下の解決策を思いつきました:
package expressions
trait Expr {
def eval : Int = {
this match {
case Number(n) => n
case Sum(e1,e2) => e1.eval + e2.eval
}
}
//def show( exp : Expr) : String
}
case class Number(n:Int) extends Expr
case class Sum(e1: Expr, e2: Expr) extends Expr
case class Prod(e1 : Expr, e2 : Expr) extends Expr
case class Var(x:Char) extends Expr
object testExpr {
def show(exp : Expr) : String = {
exp match {
case Number(x) => x.toString()
case Sum(e1, e2) => show(e1) + "+" + show(e2)
case Prod(e1,e2) =>
val st1 = e1 match {
case Sum(a,b) => "(" + show(Sum(a,b)) + ")"
case _ => show(e1)
}
val st2 = e2 match {
case Sum(a,b) => "(" + show(Sum(a,b)) + ")"
case _ => show(e2)
}
st1 + "*" + st2
case Var(x) => x.toString
}
}
}
object test extends App{
println(testExpr.show(Sum(Number(1),Number(2))))
println(Sum(Number(1),Number(3)).eval)
println(testExpr.show(Sum(Number(2),Prod(Number(10),Var('x')))))
println(testExpr.show(Sum(Prod(Number(2),Var('x')),Var('y'))))
println(testExpr.show(Prod(Sum(Number(2),Var('x')),Var('y'))))
println(testExpr.show(Prod(Sum(Number(2),Var('x')),Sum(Number(3),Var('y')))))
}
私が括弧を付けることを決定している方法は、間違いなく最善の解決策ではありません. 誰でも同じことを達成するためのより良い解決策を提案できますか?
よろしくお願いします、 パロミタ