将算术表达式表示为树
问题描述:
为了让自己准备考试,我正在做一些Scala作业。 该任务是将一个伴随对象中的函数evaluate赋值给Exp,该函数将计算由其参数Exp表示的表达式。该功能必须遵守以下特征:将算术表达式表示为树
Exp.evaluate(Exp):Int
当你完成后,下面的代码将打印1:
val e = Sub(Plus(Num(5),
Mul(Num(9),
Num(3))),
Num(5))
println(Exp.evaluate(e))
,这是代码:我停留在这个部分,我很困惑如何编写评估函数。新的工作版本:
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
+0
这是为我做的。谢谢 – David 2015-04-05 12:08:12
对于初学者,'Exp'应该是'sealed',以便您可以安全地匹配它。 – 2015-04-05 10:00:01
好的,现在你应该对它进行模式匹配。该方法将如下所示:'def evaluate(e:Exp):Int = e match {case Num(n)=> n;情况加(n1,n2)=> n1 + n2; case ...}' – 2015-04-05 10:02:24
@ChrisMartin你知道我为什么会得到类型不匹配的错误? – David 2015-04-05 10:10:27