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)
但这是题外话,与问题无关。
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)
但这是题外话,与问题无关。