В Scala я хотел бы иметь возможность определять общий тип абстрактных узлов синтаксического дерева вроде этого
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
}
Теперь я могу написать общий код, подобный этому
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)
}
Теперь моя первая проблема в том, что ключевое слово sealed
, похоже, не имеет никакого эффекта.Если я пропущу регистр в выражении соответствия, ошибки не будет.Почему и как я могу написать то, что я хочу?(У меня есть другие проблемы - например, как специализировать AST--, но я просто буду придерживаться одной проблемы на пост.)