多态方法中的Scala隐式语法

时间:2019-05-22 12:29:40

标签: scala

我是通读a parsing library的Scala新手,并且达到了一些我不理解的语法:

def parseA[_: P] = P("a")

val Parsed.Success(value, successIndex) = parse("a", parseA(_))

我希望能够将这些行合并为一个,即

val Parsed.Success(value, successIndex) = parse("a", P("a"))

但这会导致编译错误:

Error:(8, 61) overloaded method value P with alternatives:
  [T](t: fastparse.P[T])(implicit name: sourcecode.Name, implicit ctx: fastparse.P[_])fastparse.P[T] <and>
  => fastparse.ParsingRun.type
 cannot be applied to (String)
Error occurred in an application involving default arguments.
    val Parsed.Success(value, successIndex) = parse(source, P("a"))

该行应如何编写?您能否命名所涉及的语法概念以最大限度地提高我的学习水平?

1 个答案:

答案 0 :(得分:1)

_: P(implicit ctx: P[_])相同,这意味着该方法正在请求类型为P[_] 的隐式参数(下划线表示它不关心内部类型。请参见What are all the uses of an underscore in Scala?
P("a")正在调用this方法,该方法在范围上需要这种隐式,这就是为什么在您的第二个示例中,由于找不到隐式参数而导致无法编译。
这里使用的功能是隐式,存在性类型和宏...

所有这些都是非常先进的技术。如果您刚刚开始,我建议您将它们留给后者。
隐含性非常重要和有用,我将从这里开始,但首先请确保您对“正常” Scala (无论意味着什么)感到满意 >。


对于第二个问题,我认为这应该可行。

def program[_: P] = parse("a", P("a"))
val Parsed.Success(value, successIndex) = program