0
为了让自己准备考试,我正在做一些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)
对于初学者,'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