【发布时间】:2018-04-06 10:02:44
【问题描述】:
Scala:为什么将类型用作方法调用?
我是 Scala 新手,正在阅读“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`
}
源代码链接:
https://github.com/fpinscala/fpinscala/blob/master/answers/src/main/scala/fpinscala/parsing
代码sn-p:
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`
}
.....
}
【问题讨论】:
标签: scala functional-programming parser-combinators