Comment dois-je implémenter l'interpréteur «add» dans scala?
Sep 27 2020
J'implémente l'interpréteur scala et j'ai un problème
J'ai la classe de valeur comme suit dans Value.scala:
case class IntV(value: Int) extends Value
J'ai également suivi la classe dans le fichier Expr.scala:
case class IntE(value: Int) extends Expr
case class Add(left: Expr, right: Expr) extends Expr
Quand j'ai implémenté l'interpréteur Int comme suit:
case IntE(value)=>IntV(value)
Cela a bien fonctionné mais quand j'ai implémenté ajouter un interpréteur (qui ajoute comme 3 + 4 = 7) comme suit:
case Add(left, right)=>IntV(left)+IntV(right)
Il renvoie une erreur qui indique que pour la variable gauche et droite, il faut Intmais il a trouvé expr.
Qu'ai-je fait de mal? Que dois-je faire pour obtenir un retour correct?
Réponses
3 DmytroMitin Sep 27 2020 at 14:31
Vous devez appeler l'interpréteur de manière récursive.
Par exemple
sealed trait Value
case class IntV(value: Int) extends Value
sealed trait Expr
case class IntE(value: Int) extends Expr
case class Add(left: Expr, right: Expr) extends Expr
def interpret(expr: Expr): Value = expr match {
case IntE(value) => IntV(value)
case Add(left, right) => (interpret(left), interpret(right)) match {
case (IntV(v1), IntV(v2)) => IntV(v1 + v2)
}
}
interpret(IntE(1)) // IntV(1)
interpret(Add(IntE(3), IntE(4))) // IntV(7)
Ou avec une méthode définie +pourIntV
sealed trait Value
case class IntV(value: Int) extends Value {
def +(other: IntV): IntV = IntV(value + other.value)
}
sealed trait Expr
case class IntE(value: Int) extends Expr
case class Add(left: Expr, right: Expr) extends Expr
def interpret(expr: Expr): Value = expr match {
case IntE(value) => IntV(value)
case Add(left, right) => (interpret(left), interpret(right)) match {
case (v1: IntV, v2: IntV) => v1 + v2
}
}