Scala “我如何摆脱”;“由于删除而未选中”;模式匹配时发出警告

Scala “我如何摆脱”;“由于删除而未选中”;模式匹配时发出警告,scala,pattern-matching,type-erasure,parser-combinators,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(...

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 ).*

}
是否有人建议在没有此警告的情况下以优雅的方式提取
expr
?它按原样工作。我应该忽略它吗?我不愿养成忽视警告的习惯

编辑:回答。这实际上是我第一次尝试的,但后来我添加了类型,因为intelliJ scala插件无法推断它们

  val repeatParser: Parser[Expr] = (l("repeat") ~> number) ~ (l("{") ~> expressions <~ l("}")) ^^ {
      case times ~ exprs =>
          Repetition(times, exprs)
  }
val repeatParser:Parser[Expr]=(l(“repeat”)~>number)~(l(“{”)~>表达式
重复(次数,表达式)
}

我认为您的语法不适合第一个“不构建”示例(看起来您返回的是部分函数,而不是应用它,这不是您想要的)。请尝试 写作:

val repeatParser:Parser[Expr]=(l(“repeat”)~>number)~(l(“{”)~>表达式
重复(次数,表达式)
}
恐怕我不能测试这个,因为我没有你剩下的代码
取决于,但这种构造通常是有效的。

公认的答案是最好的,但在不起作用时,这里有一些替代方案:

r: ~[t1, t2] => {
  case times ~ exprs =>
    Repetition(times, exprs)
}
上面,
t1
t2
是推断出来的,它们可能只是被推断成
Any
。但是,无论它们被推断成什么,这都是使用该语法所能做的最好的事情

val ~(times: Int, exprs: List[t]) = repetitions

在这里,因为您正在提取值,所以实际上可以检查类型。您不是在测试是否有
~[Int,List[Int]]
——您是在测试提取的值是否有类型
Int
List[t]
。请注意,您收到的警告来自
列表的type参数

,我想知道的是为什么您的第一个“未生成”示例不构建…我认为Scala能够推断出case表达式中的类型。你会得到什么错误?是的,我完全理解擦除的事情。我在代码中得到的和公认答案之间的唯一区别是我有显式类型。问题是我现在太依赖IntelliJ Scala插件了ing。它用一条红色的曲线抱怨说,~的类型在那里无法推断。编译器说不是这样。在过去8个月左右的时间里,它帮助我学习了该语言,这非常好,但随着我使用更高级的结构,重构工具和上下文帮助开始停止正常工作。@Stevens博士,我不确定我们在谈论同样的事情。当我写
~[t1,t2]
我说得非常精确:这里使用小写类型向编译器表明它应该推断类型,并将它们分配给
t1
t2
。你说得对,我们谈论的不是同一件事。我不知道小写类型参数在这里有意义。我需要了解更多。谢谢你或者用它来回答。@Stevens博士我自己花了两年多的时间才了解它,它相当模糊。请注意,“这里”指的是模式匹配。它也不适用于
val
声明,除非它发生在模式内部(如
val-Some(t:~[t1,t2])=…
r: ~[t1, t2] => {
  case times ~ exprs =>
    Repetition(times, exprs)
}
val ~(times: Int, exprs: List[t]) = repetitions