Функция в Scala - это объект, который реализует одну из черт FunctionN
. Например:
scala> def f(x: Int) = x * x
f: (x: Int)Int
scala> val ff = f _
ff: Int => Int = <function1>
scala> val fff: Function1[Int, Int] = f _
fff: Int => Int = <function1>
Пока все хорошо. Но что, если у нас есть функция, которая принимает параметр по имени? Это, конечно, все еще реализует одну из черт FunctionN
:
scala> def g(x: => Int) = x * x
g: (x: => Int)Int
scala> val gg = g _
gg: => Int => Int = <function1>
scala> gg.isInstanceOf[Function1[_, _]]
res0: Boolean = true
Но какого именно типа? Это не Function1[Int, Int]
:
scala> val ggg: Function1[Int, Int] = g _
<console>:8: error: type mismatch;
found : => Int => Int
required: Int => Int
val ggg: Function1[Int, Int] = g _
^
И это не Function1[Function0[Int], Int]
:
scala> val ggg: Function1[Function0[Int], Int] = g _
<console>:8: error: type mismatch;
found : => Int => Int
required: () => Int => Int
val ggg: Function1[Function0[Int], Int] = g _
^
И Function1[=> Int, Int]
не компилируется:
scala> val ggg: Function1[=> Int, Int] = g _
<console>:1: error: identifier expected but '=>' found.
val ggg: Function1[=> Int, Int] = g _
^
Так что это?