如何在模式匹配时摆脱"由于擦除而未检查"警告

drs*_*ens 3 scala pattern-matching type-erasure parser-combinators

Scala 2.8.1

我使用解析器/组合器实现了一个非常简单的外部DSL,用于QA编写验收测试.

最近我添加了循环遍历一组表达式的能力

sealed trait Expr

...
//insert other case classes extending 'Expr' here
...

case class Repetition(times: Int, expressions: List[Expr]) extends Expr

class TestFixtureParser(....) extends RegexParsers {
  val repeatParser: Parser[Expr] = (l("repeat") ~> number) ~ (l("{") ~> expressions <~ l("}")) ^^ {
    case (times: Int) ~ (exprs: List[Expr]) => {
      Repetition(times, exprs)
    }
  }

  private val expressions: Parser[List[Expr]] = (repeatParser | 
    /*insert other Parser[Expr]s '|' together here */ | verifyParser ).*

}
Run Code Online (Sandbox Code Playgroud)

在构建时,我会warning: non variable type-argument ... is unchecked since it is eliminated by erasure在模式匹配时收到警告.我也尝试使用以下方法进行提取.

  //Doesn't build with error
  /*
    error: missing parameter type for expanded function ((x0$2) => x0$2 match {
      case $tilde((times @ _), (exprs @ _)) => Repetition(times, exprs)
    })
        r: ~[Int, List[Expr]] => {
  */
  val repeatParser: Parser[Expr] = (l("repeat") ~> number) ~ (l("{") ~> expressions <~ l("}")) ^^ {
    r: ~[Int, List[Expr]] => {
      case times ~ exprs =>
        Repetition(times, exprs)
    }
  }

  //Actually this does build without warning. 
  //I am unfortunately using intelliJ and it doesn't like it
  val repeatParser: Parser[Expr] = (l("repeat") ~> number) ~ (l("{") ~> expressions <~ l("}")) ^^ {
    repetitions: ~[Int, List[Expr]] => {
      val ~(times, exprs) = repetitions
      Repetition(times, exprs)
    }
  }

  //Builds but same warning
  val repeatParser: Parser[Expr] = (l("repeat") ~> number) ~ (l("{") ~> expressions <~ l("}")) ^^ {
    repetitions => {
      val ~(times: Int, exprs: List[Expr]) = repetitions
      Repetition(times, exprs)
    }
  }
Run Code Online (Sandbox Code Playgroud)

有没有人有任何建议,exprs没有这个警告,以优雅的方式提取?它确实起作用.我应该忽略它吗?我不想养成忽视警告的习惯.

编辑:答案.这实际上是我先尝试但后来我添加了类型因为intelliJ scala插件无法推断它们.

  val repeatParser: Parser[Expr] = (l("repeat") ~> number) ~ (l("{") ~> expressions <~ l("}")) ^^ {
      case times ~ exprs =>
          Repetition(times, exprs)
  }
Run Code Online (Sandbox Code Playgroud)

Owe*_*wen 5

我认为你的语法不适合第一个"不构建"的例子(看起来你正在返回一个部分函数而不是应用它,这不是你想要的).试着写:

val repeatParser: Parser[Expr] = (l("repeat") ~> number) ~ (l("{") ~> expressions <~ l("}")) ^^ {
    case times ~ exprs =>
        Repetition(times, exprs)
}
Run Code Online (Sandbox Code Playgroud)

我担心我无法测试这个,因为我没有依赖的其余代码,但这种构造通常有效.