我无法解释指定为没有 LHS(左侧)的函数参数的“双右箭头类型”,例如() => Int
来自()
to Int
但什么只是=> Int
意思是?
例如请参阅第一个参数foo
下面的方法,是什么类型f
? Is it (Int, () => Int) => Int
?
对于定义bar
,其中 y 按名称传递,我将其解释为不带参数的函数,该函数将生成 Int,这看起来相当于定义baz
.
我可以尝试推理f
in foo
将第二个参数视为按名称调用,并且不是来自() => Int
但这与事实相矛盾bar
and baz
javap 中的定义是相同的。我缺少什么?
object ParamTest {
def foo(f: (Int, => Int) => Int, x: Int) : Int = 10
def bar(x: Int, y: => Int) : Int = 20
def baz(x: Int, f: () => Int) : Int = 30
def qux(f: (Int, () => Int) => Int, x: Int) : Int = 40
}
为了测试我编译了上面的类scalac ParamTest.scala
javap ParamTest
给我:
public final class ParamTest {
public static int qux(scala.Function2<java.lang.Object, scala.Function0<java.lang.Object>, java.lang.Object>, int);
public static int baz(int, scala.Function0<java.lang.Object>);
public static int bar(int, scala.Function0<java.lang.Object>);
public static int foo(scala.Function2<java.lang.Object, scala.Function0<java.lang.Object>, java.lang.Object>, int);
}
这似乎表明 foo 和 qux 具有相同的方法签名。换句话说,我可以解释=> Int
as () => Int
, but
foo(baz,100)
给我一个类型不匹配错误
scala> import ParamTest._
import ParamTest._
scala> foo(bar,100)
res0: Int = 10
scala> foo(baz,100)
<console>:11: error: type mismatch;
found : (Int, () => Int) => Int
required: (Int, => Int) => Int
foo(baz,100)
^
EDIT: 这和这个问题 https://stackoverflow.com/questions/4543228/whats-the-difference-between-and-unit。我不是问两者之间的实际区别call-by-name: => Type
and () => Type
。我更感兴趣的是了解内部结构。 scala 如何区分这两者,当 javap 或CFR反编译 http://www.benf.org/other/cfr/给了我相同的定义foo
and qux
;并为bar
and baz
.