Funkcja w Scali jest obiektem, który implementuje jedną z cech FunctionN
. Na przykład:Co to jest funkcja FunctionN, która reprezentuje funkcję przyjmującą parametr nazwy?
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>
Jak dotąd, tak dobrze. Ale co, jeśli mamy funkcję, która przyjmuje parametr nazwy? To na pewno ma jeszcze wdrożyć jedną z FunctionN
cech:
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
Ale jakiego rodzaju to jest dokładnie? Nie Function1[Int, Int]
to:
scala> val ggg: Function1[Int, Int] = g _
<console>:8: error: type mismatch;
found : => Int => Int
required: Int => Int
val ggg: Function1[Int, Int] = g _
^
Nie jest to 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 _
^
I Function1[=> Int, Int]
nie kompilacji:
scala> val ggg: Function1[=> Int, Int] = g _
<console>:1: error: identifier expected but '=>' found.
val ggg: Function1[=> Int, Int] = g _
^
Więc o co chodzi?
Oczywiście - nie mam wątpliwości, że to właśnie dzieje się pod maską.Ale jeśli chcę określić typ funkcji, zamiast pozwalać jej wywnioskować, co to dokładnie jest? Na pewno nie może być tak, że mogę stworzyć coś, w czym nie mogę napisać jego typu? Czy to możliwe ?! –
Nie jestem pewien, czy możesz to zrobić. To znaczy, że faktycznie istnieje "typ" odpowiadający argumentowi o nazwie. Na przykład. 'gg.getClass.getMethods.find (_. getName ==" apply "). get uzyskuje również typ argumentu' Function0'. Ale w przypadku * kompilatora * ta konwersja jeszcze nie nastąpiła, więc mówi ci, że 'Function0' nie jest typem wymaganym (twoja próba przedostatnia). –