У меня возникли проблемы с интерпретацией типа double-rightarrow Type, указанного как аргумент функции без LHS (слева), например. () => Int
от ()
до Int
, но что означает только => Int
?
например см. первый аргумент метода foo
ниже, каков тип f
? Это (Int, () => Int) => Int
?
Для определения bar
, где y передается по имени, я интерпретировал его как функцию без аргумента, которая создаст Int, который выглядит эквивалентно определению baz
.
Я мог бы попытаться объяснить, что f
в foo
принимает второй аргумент как вызов по имени и не от () => Int
, но это противоречит тому факту, что определения bar
и 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
как () => Int
, но
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: это не то же самое, что этот вопрос. Я не задаю практических различий между call-by-name: => Type
и () => Type
. То, что мне больше интересно знать, - это внутренности. Как scala различает два, когда javap или декомпиляция cfr дает мне идентичные определения для foo
и qux
; и для bar
и baz
.