2015-04-05 3 views
0

Чтобы подготовить себя к экзамену, я выполняю назначение scala. Задача состоит в том, чтобы реализовать функцию, оцениваемую в объекте-компаньоне, для 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' должен быть« запечатан », чтобы вы могли безопасно сопоставить образец. –

+0

Итак, теперь вы должны сопоставить образец с ним. Метод будет выглядеть так: 'def оценить (e: Exp): Int = e match {case Num (n) => n; case Plus (n1, n2) => n1 + n2; case ...} ' –

+0

@ChrisMartin вы знаете, почему я получаю ошибку несоответствия типа ?? – David

ответ

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

Смежные вопросы