X类采用类型参数

时间:2013-11-25 17:24:43

标签: scala parser-generator

通过这篇内容丰富,写得很好的Parser Combinators文章,我看到了这段代码:

class DisParser[+A](left: Parser[A], right: Parser[A]) extends Parser[A] {
  def apply(s: Stream[Character]) = left(s) match {
    case res: Success => res
    case _: Failure => right(s)
  }
}

当我尝试编译此代码时,我得到:

Parser.scala:19: error: class Success takes type parameters
    case res: Success => res
              ^
one error found

鉴于Parser的签名:

case class Success[+A](value: A, rem: Stream[Character]) extends Result[A]

如何更改case res: Success => res行以为Success提供正确的类型参数?

2 个答案:

答案 0 :(得分:6)

您使用的是哪个Success?这一个(来自Parsers包的Success)或者这个(来自util的Success)?两者都采用类型参数,因此您需要将其设置为

res @ Success(_, _) =>

否则你将不得不处理删除警告。

答案 1 :(得分:2)

您的解析器应返回类型为Result[A]的值,因为其类型定义(基本上解析器是从字符流到解析结果的函数)。:

trait Parser[+A] extends (Stream[Character]=>Result[A])

所以你有两个选择:

case res@Success(_,_) => res

是否与返回的案例类的变体匹配。

case res:Success[_] => res.asInstanceOf[Success[A]]

与返回的类型匹配(使用instanceof操作)。这就是你必须强制转换的原因(你没有匹配没有typetag值的类型参数,因为JVM会输入类型擦除)。

两者在您的情况下都有效,在第一种情况下,您省略了type参数(这是您原始错误的内容)。在您尝试关注@wheaties建议时,您在代码中的某处出现了语法错误,但这确实是最好的方法。