Чтобы подготовить себя к экзамену, я выполняю назначение 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)
Во-первых, 'Exp' должен быть« запечатан », чтобы вы могли безопасно сопоставить образец. –
Итак, теперь вы должны сопоставить образец с ним. Метод будет выглядеть так: 'def оценить (e: Exp): Int = e match {case Num (n) => n; case Plus (n1, n2) => n1 + n2; case ...} ' –
@ChrisMartin вы знаете, почему я получаю ошибку несоответствия типа ?? – David