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.但毕竟为什么不呢?
为什么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编译器必须做很多事情的原因之一.