2015-04-05 97 views
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) 
+0

对于初学者,'Exp'应该是'sealed',以便您可以安全地匹配它。 – 2015-04-05 10:00:01

+0

好的,现在你应该对它进行模式匹配。该方法将如下所示:'def evaluate(e:Exp):Int = e match {case Num(n)=> n;情况加(n1,n2)=> n1 + n2; case ...}' – 2015-04-05 10:02:24

+0

@ChrisMartin你知道我为什么会得到类型不匹配的错误? – David 2015-04-05 10:10:27

回答

2

试试这个办法很有效。

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