Scala:为什么用作方法调用的类型?

时间:2018-04-06 01:16:31

标签: scala functional-programming parser-combinators

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`
}

1 个答案:

答案 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)

但这是暂时的,这与问题无关。