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

Scala: why is a type used as a method call?

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

我是 Scala 新手,正在阅读 "Functional Programming in Scala" 作者:PAUL CHIUSANO 和 RÚNAR BJARNASON。

我试图理解第 9 章中解析器组合子的源代码,但我被一个 问题:在源代码中,Parser[A] 被声明为一个类型,但我可以看到 Parser[A] 用作方法调用。

我的问题是:为什么类型的实例可以用作方法 打电话?

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

Link 到源码:

https://github.com/fpinscala/fpinscala/blob/master/answers/src/main/scala/fpinscala/parsing

代码片段:

trait Parsers[Parser[+_]] { self => 
  .....
}


object ReferenceTypes {

  /** A parser is a kind of state action that can fail. */
  type Parser[+A] = ParseState => Result[A]

  case class ParseState(loc: Location) {
    ......
  }

  sealed trait Result[+A] {
    ......
  }

  case class Success[+A](get: A, length: Int) extends Result[A]
  case class Failure(get: ParseError, isCommitted: Boolean) extends Result[Nothing]

}

object Reference extends Parsers[Parser] {

  ......

  def or[A](p: Parser[A], p2: => Parser[A]): Parser[A] =
    s => p(s) match {
      case Failure(e,false) => p2(s)
      case r => r // committed failure or success skips running `p2`
  }

  .....
}

在您引用的代码中,Parser[+A] 被显式声明为函数类型

type Parser[+A] = ParseState => Result[A]

因此,Parser[+A] 类型的值可以应用于 ParseState 类型的值。将 X => Y 类型的函数 p 应用于 X 类型的值 s 的常用语法是

p(s)

所以,这只是普通的函数应用,它甚至不是一些 user-defined class.

的花哨重写 apply 方法

一个方法调用通常如下所示:

obj.methodName(argument)

它需要一个调用该方法的对象。如果对象是 this,或者如果您之前导入了

,则可以省略
import obj._

这样这个对象的所有方法在当前范围内都可用。在所有其他情况下,您需要一个接收对象,您可以在该对象上调用方法。


函数应用

p(s)

实际上是脱糖到一个特殊的方法调用中

p.apply(s)

但这是题外话,与问题无关。