Специализирующиеся универсальные запечатанные типы - PullRequest
0 голосов
/ 15 октября 2011

В 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--, но я просто буду придерживаться одной проблемы на пост.)

1 Ответ

0 голосов
/ 16 октября 2011

Нет ошибки - есть предупреждение .Например:

scala> :paste
// Entering paste mode (ctrl-D to finish)

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
}

// Exiting paste mode, now interpreting.

defined class AST
defined class LeafAST
defined class BranchAST

scala> def countLeaves[T <: AST[T]]( x : AST[T]) : Int = x match {
     |     case LeafAST( x ) => 1
     | }
<console>:10: warning: match is not exhaustive!
missing combination      BranchAST

       def countLeaves[T <: AST[T]]( x : AST[T]) : Int = x match {
                                                         ^
countLeaves: [T <: AST[T]](x: AST[T])Int

Вы можете превратить это в ошибку с флагом -Xfatal-warnings.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...