En Scala, je voudrais être en mesure de définir un type générique de nœuds d'arbre de syntaxe abstraite un peu comme ceSpécialiste Types Sealed génériques
sealed abstract class AST[T <: AST[T]] {
def child : List[T] ;
}
case class LeafAST[T <: AST[T]](x : Int) extends AST[T] {
def child = Nil
}
case class BranchAST[T <: AST[T]](left : T, right : T) extends AST[T] {
def child = left :: right :: Nil
}
Maintenant, je peux écrire du code générique comme celui-ci
def countLeaves[T <: AST[T]](x : AST[T]) : Int = x match {
case LeafAST(x) => 1
case BranchAST(left, right) => countLeaves[T](left) + countLeaves[T](right)
}
Maintenant, mon premier problème est que le mot-clé sealed
semble n'avoir aucun effet. Si je omets un cas de l'expression de correspondance, il n'y a pas d'erreur. Pourquoi et comment puis-je écrire ce que je veux? (J'ai d'autres problèmes - par exemple, comment spécialiser AST--, mais je vais juste coller à un problème par poste.)
Quelle version de Scala utilisez-vous? 2.9.1.final ne semble pas avoir ce problème. Je reçois l'avertissement "match is not exhaustif" comme prévu. (BTW c'est un avertissement et pas une erreur.) – agilesteel
En raison de votre réponse j'ai mis à niveau vers le plug-in Eclipse à http://download.scala-ide.org/releases/2.0.0-beta avec un outil 2.9.2 -chaîne. Toujours pas de message _warning_ si je rate un cas. –
La version bêta du plug-in Eclipse est en cours de développement et manque donc de nombreuses fonctionnalités. J'ai utilisé le REPL et comme je l'ai dit plus tôt, cela semble fonctionner. – agilesteel