Scala:为什么用作方法调用的类型?
我是Scala的新手,我正在阅读“Scala中的函数编程” 作者:PAUL CHIUSANO和RÚNARBJARNASON。
我试图在第9章中理解解析器组合器的源代码,但是我被一个问题所困扰
问题:在源代码中,BeforeAndAfterAll
被声明为一个类型,但我可以看到它的实例
Parser[A]
用作方法调用。
我的问题是:为什么类型的实例可以用作方法 调用
Parser[A]
链接到源代码:
https://github.com/fpinscala/fpinscala/blob/master/answers/src/main/scala/fpinscala/parsing
代码段:
def or[A](p: Parser[A], p2: => Parser[A]): Parser[A] =
s => p(s) match { // ========> p is used as a method call.
case Failure(e,false) => p2(s)
case r => r // committed failure or success skips running `p2`
}
答案 0 :(得分:2)
在您引用的代码中,Parser[+A]
被显式声明为函数类型
type Parser[+A] = ParseState => Result[A]
因此,类型Parser[+A]
的值可以应用于ParseState
类型的值。将p
类型的函数X => Y
应用于s
类型的值X
的常用语法是
p(s)
所以,它只是通常的函数应用程序,它甚至不是某些用户定义类的一些花哨的覆盖apply
方法。
方法调用通常如下所示:
obj.methodName(argument)
它需要一个调用该方法的对象。如果对象为this
,或者您之前已导入
import obj._
以便此对象的所有方法都可在当前范围内使用。在所有其他情况下,您需要一个调用方法的接收对象。
功能应用
p(s)
实际上是一个特殊的方法调用
p.apply(s)
但这是暂时的,这与问题无关。