Ich habe die folgenden Fallklassen. Ausdrücke sind mathematische Operationen und Zahlen. Zum Beispiel ist add eine Unterklasse von expression und rekursiv enthält es zwei Felder, die num sind, was auch Unterklasse von expression ist.Hinzufügen von Feldern von Fallklassen in Scala
abstract class Expression
case class num (num: Int) extends Expression
case class add (left: Expression, right: Expression) extends Expression
abstract class Result
case class numericResult (v : Int) extends Result
Es gibt andere Arten von Return als auch, damit ich nicht Fallklassen
Evaluate-Methode soll Ausdruck nehmen entfernen kann, unbox es dann die Operation durchführt und ein Ergebnis zurück, die Kästen im Ergebnis sind Klasse
def evaluate(expr: Expression) : Result = {
expr match {
case num(n) => new numericResult(n)
case add(l, r) => new numericResult(evaluate(l).v + evaluate(r).v) //add will never be called on imaginary numbers
case addi(l, r) => new imaginaryResult(...) //adds imaginary numbers
}
}
Aber wenn ich versuche, es zu bewerten, ich erhalte eine Fehlermeldung:
error: value v is not a member of Result
Wie kann ich sicherstellen, dass Scala weiß, dass l und r vom Typ num sind, und wenn sie ausgewertet werden, gibt es numericResult statt Result? Ich kann annehmen, dass, wenn add evaluate (l) und evaluate (r) numericResut zurückgibt, aber l und r auch verschachtelte Adds sein könnten.
Warum nicht dann wieder 'numericResult' von' evaluate'? – Tair
def auswerten (expr: Ausdruck): numericResult = ... – Tair
Es gibt andere Typen, die auswerten können –