将算术表达式表示为树
representing arithmetic expressions as trees
为了准备考试,我正在做一些 Scala 作业。
任务是在 Exp 的伴随对象中实现一个函数 evaluate,该函数计算由其参数 Exp 表示的表达式。该函数必须遵循以下签名:
Exp.evaluate(Exp):Int
完成后,以下代码将打印 1:
val e = Sub(Plus(Num(5),
Mul(Num(9),
Num(3))),
Num(5))
println(Exp.evaluate(e))
这是 code:I 我卡在了这一部分,因为我对如何编写求值函数感到困惑。新工作版本:
sealed abstract case class Exp
case class Num(n : Int) extends Exp
case class Plus(n1 : Exp, n2 : Exp) extends Exp
case class Mul(n1 : Exp, n2 : Exp) extends Exp
case class Sub(n1 : Exp, n2 : Exp) extends Exp
object Exp {
def evaluate(e : Exp) : Int = {
e match {
case Num(n) => n
case Plus(n1, n2) => add(n1, n2)
case Mul(n1, n2) => times(n1, n2)
case Sub(n1, n2) => minus(n1, n2)
//case _ => error("nothing")
}
}
def add(n1 : Exp, n2 : Exp) : Int = (n1,n2) match {
case (Num(x), Num(y)) => x+y
}
def times(n1 : Exp, n2 : Exp) : Int = (n1,n2) match {
case (Num(x), Num(y)) => x*y
}
def minus(n1 : Exp, n2 : Exp) : Int = (n1,n2) match {
case (Num(x), Num(y)) => x-y
}
}
//
但现在它没有通过我的测试:
def testEvalSkel {
expect(11) {
evaluate(Plus(Mul(Num(3),Num(4)),Sub(Num(3),Num(4))))
}
}
我得到这个错误:
Test testEvalSkel failed: (Mul(Num(3),Num(4)),Sub(Num(3),Num(4))) (of class scala.Tuple2)
试试这个方法吧。
trait Exp
case class Num(n: Int) extends Exp
case class Plus(n1: Exp, n2: Exp) extends Exp
case class Mul(n1: Exp, n2: Exp) extends Exp
case class Sub(n1: Exp, n2: Exp) extends Exp
object Exp {
def evaluate(e: Exp): Int = {
e match {
case Num(n) => n
case Plus(e1, e2) => add(e1,e2)
case Mul(e1, e2) => times(e1, e2)
case Sub(e1, e2) => minus(e1, e2)
}
}
def add(n1: Exp, n2: Exp): Int = evaluate(n1) + evaluate(n2)
def times(n1: Exp, n2: Exp): Int = evaluate(n1) * evaluate(n2)
def minus(n1: Exp, n2: Exp): Int = evaluate(n1) - evaluate(n2)
}
val e = Plus(Mul(Num(3),Num(4)),Sub(Num(3),Num(4)))
println(Exp.evaluate(e)) // prints 11
为了准备考试,我正在做一些 Scala 作业。 任务是在 Exp 的伴随对象中实现一个函数 evaluate,该函数计算由其参数 Exp 表示的表达式。该函数必须遵循以下签名:
Exp.evaluate(Exp):Int
完成后,以下代码将打印 1:
val e = Sub(Plus(Num(5),
Mul(Num(9),
Num(3))),
Num(5))
println(Exp.evaluate(e))
这是 code:I 我卡在了这一部分,因为我对如何编写求值函数感到困惑。新工作版本:
sealed abstract case class Exp
case class Num(n : Int) extends Exp
case class Plus(n1 : Exp, n2 : Exp) extends Exp
case class Mul(n1 : Exp, n2 : Exp) extends Exp
case class Sub(n1 : Exp, n2 : Exp) extends Exp
object Exp {
def evaluate(e : Exp) : Int = {
e match {
case Num(n) => n
case Plus(n1, n2) => add(n1, n2)
case Mul(n1, n2) => times(n1, n2)
case Sub(n1, n2) => minus(n1, n2)
//case _ => error("nothing")
}
}
def add(n1 : Exp, n2 : Exp) : Int = (n1,n2) match {
case (Num(x), Num(y)) => x+y
}
def times(n1 : Exp, n2 : Exp) : Int = (n1,n2) match {
case (Num(x), Num(y)) => x*y
}
def minus(n1 : Exp, n2 : Exp) : Int = (n1,n2) match {
case (Num(x), Num(y)) => x-y
}
}
//
但现在它没有通过我的测试:
def testEvalSkel {
expect(11) {
evaluate(Plus(Mul(Num(3),Num(4)),Sub(Num(3),Num(4))))
}
}
我得到这个错误:
Test testEvalSkel failed: (Mul(Num(3),Num(4)),Sub(Num(3),Num(4))) (of class scala.Tuple2)
试试这个方法吧。
trait Exp
case class Num(n: Int) extends Exp
case class Plus(n1: Exp, n2: Exp) extends Exp
case class Mul(n1: Exp, n2: Exp) extends Exp
case class Sub(n1: Exp, n2: Exp) extends Exp
object Exp {
def evaluate(e: Exp): Int = {
e match {
case Num(n) => n
case Plus(e1, e2) => add(e1,e2)
case Mul(e1, e2) => times(e1, e2)
case Sub(e1, e2) => minus(e1, e2)
}
}
def add(n1: Exp, n2: Exp): Int = evaluate(n1) + evaluate(n2)
def times(n1: Exp, n2: Exp): Int = evaluate(n1) * evaluate(n2)
def minus(n1: Exp, n2: Exp): Int = evaluate(n1) - evaluate(n2)
}
val e = Plus(Mul(Num(3),Num(4)),Sub(Num(3),Num(4)))
println(Exp.evaluate(e)) // prints 11