了解函数文字类型

时间:2012-12-05 18:22:53

标签: scala compiler-construction functional-programming

假设这段代码:

  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?")
  }

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

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

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

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

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

1 个答案:

答案 0 :(得分:6)

  

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

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

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

相关问题