了解函数文字类型

Mik*_*378 2 compiler-construction functional-programming scala

假设这段代码:

  def main(args: Array[String]) {
    val func = (x: String, y :String) => x + ", " + y
    println(myFunc(func))
  }

  def myFunc(f: (String, String) => String) = {
    f("Hey","how are you?")
  }
Run Code Online (Sandbox Code Playgroud)

此代码的第二行被编译器替换为:

val func = new Function2[String, String, String] {
             def apply(x: String, y: String): String = x + ", " + y
           } 
Run Code Online (Sandbox Code Playgroud)

我可以推断,func在这种情况下,该类型也对应于(String, String) => String)类型,如myFunc签名所示; 意思Function2[String, String, String]是与...相同的类型(String, String) => String.

为什么不同的符号?为什么Scala编译器还没有将函数文字转换为某种概念:new ((String, String) => String)没有Function2[String, String, String]类型的无聊?或相反亦然.

一种解释是类名不能是多部分的:(T1, T2) => R.但毕竟为什么不呢?

Tom*_*icz 6

为什么Scala编译器还没有将函数文字转换为某种概念: new (String, String) => String

请记住,Scala编译为JVM字节码.JVM中没有" 概念new (String, String) => String " 这样的东西.只有对象和方法(至少在Java 8之前).在Java语言中,你必须使用无聊Callable<T>,Runnable或各种Function番石榴和Apache共享抽象.没有其他办法了.从这个角度来看,Scala基本上通过在匿名FunctionX[...]类上添加语法糖来隐藏Java样板.

这也是当你使用一个预期函数的方法(所谓的eta扩展)时,Scala编译器必须做很多事情的原因之一.