通过这篇内容丰富,写得很好的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
提供正确的类型参数?
答案 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建议时,您在代码中的某处出现了语法错误,但这确实是最好的方法。