2012-10-23 2 views
1

Voici le code que je suis en train d'utiliser pour illustrer la correspondance de motif:modèle Comprendre correspondant à l'exemple de code

package patternmatching 

object patterntest { 

    abstract class Expr 
    case class Var(name: String) extends Expr 
    case class Number(num: Double) extends Expr 
    case class UnOp(operator: String , arg: Expr) extends Expr 
    case class BinOp(operator: String, left: Expr, right: Expr) extends Expr 

    def simplifyTop(expr: Expr): Expr = expr match { 
     case UnOp("-", UnOp("-", e)) => e //double negation 
     case BinOp("+", e, Number(0)) => e //adding zero 
     case BinOp("*", e, Number(1)) => e //Mutiplying by one 
     case _ => expr 
    } 


    def main(args: Array[String]) { 
     UnOp("-" , UnOp("-", e)) 
    } 

} 

Comment puis-je tester chacun des modèles? La ligne UNOP ("-", UNOP ("-", e)) au sein de la principale méthode donne une erreur:

not found: value e 
+3

'UnOp (" - ", UnOp (" - ", Var (" foo ")))' dans principal, non? –

+0

@ om-nom-nom Merci, cela vous dérangerait-il d'expliquer comment fonctionne la correspondance de motifs dans le contexte ci-dessus. Je ne comprends toujours pas. – user701254

+1

Dans la méthode principale, vous construisez deux UnOp imbriqués où l'un interne le deuxième argument vous essayez de passer une variable indéfinie. – pedrofurla

Répondre

1

En premier lieu, remplacer la principale méthode avec la suivante:

def main(args: Array[String]) { 
    val sample = UnOp("-" , UnOp("-", Number(0)) // no more undefined variable 
    val simplified = simplifyTop(sample) 
    println(simplified) 
} 

Il imprimera probablement quelque chose comme Number(0) qui correspond à la première expression de cas.

Personnellement, j'aime penser que les classes de cas construisent des valeurs et que le modèle déconstruit eux. Dans ce processus de déconstruire les valeurs avec la correspondance de motif, vous pouvez également lier les pièces aux variables. Après une correspondance, vous utilisez ces variables.

Par exemple, dans simplifyTop le BinOp("+", e, Number(0)) se correspondent lorsque expr est un binop, son champ operator a une valeur « + » et right champ a une valeur « Number (0) », le champ left peut avoir une instance de Expr et son La valeur sera liée à la variable e.

Un autre exemple serait case BinOp("+", Number(l), Number(r)) => Number(l+r), ce cas serait non seulement extrait - la déconstruction dans le jargon Scala - la valeur extérieure de type binop mais aussi ses parties intérieures, qui sont Number s.