代码之家  ›  专栏  ›  技术社区  ›  CodingNow

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

  •  2
  • CodingNow  · 技术社区  · 8 年前

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

    我是Scala新手,正在阅读“Scala中的函数编程” 保罗·丘萨诺和RÃNAR BJARNASON合著。

    我试图理解第9章中parser combinator的源代码,但我被一个 问题:在源代码中, 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

    代码段:

    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`
      }
    
      .....
    }
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Andrey Tyukin    8 年前

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

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

    因此,类型的值 解析器[+A] 可应用于类型的值 ParseState .应用函数的常用语法 p 的类型 X => Y 到某个值 s 的类型 X 是

    p(s)
    

    所以,它只是一个普通的函数应用程序,它甚至没有被覆盖 apply 某个用户定义类的方法。


    A. 方法调用 通常如下所示:

    obj.methodName(argument)
    

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

    import obj._
    

    以便此对象的所有方法在当前范围内可用。在所有其他情况下,您需要一个接收对象来调用方法。


    函数应用程序

    p(s)
    

    实际上,将desugars转换为一个特殊的方法调用

    p.apply(s)
    

    但这只是一个旁白,与这个问题无关。

    推荐文章