W Scali można robić takie rzeczy jak:funkcyjne ukryte parametry nie więcej więc po minięciu go do funkcja wyższego rzędu
def foo(implicit v: Int) = println(v);
def h(x: Int) = { implicit val i: Int = x; foo }
h(42)
> 42
h
wezwanie dostaje foo
odniesienie jako zamknięcie.
Nie byłoby dziwne, aby spróbować przechodząc foo
do h
jako parametr:
def g(x: Int)(f: Int => Unit) = { implicit val i: Int = x; f }
Ale to nie będzie działać:
g(1)(foo)
> error: could not find implicit value for parameter v: Int
Co myślę, że to się dzieje, że dostaje foo
zwany jako ocena rzeczywistego parametru. Czy to prawda?
Po przekazaniu funkcji z normalnym listy parametrów (nie ukryte), funkcja nie jest oceniany:
def foo2(v: Int) = println("Foo2")
g(1)(foo2)
> Int => Unit = <function1>
Jest to oczekiwany wynik i foo2
ocena nie jest sądzony jako oceny rzeczywistej parametr.
Dlaczego foo
jest oceniany jako rzeczywisty parametr, gdy nie są dostępne żadne ukryte wartości?
samo dzieje się z przypisanie:
val fooref: Int => Unit = foo
> error: could not find implicit value for parameter v: Int
To jakby od Int => Unit
nie zgadza się z funkcją gdzie parametr Int
oznaczonego jako niejawny, kompilator wyrzucić go jako ważnego parametru rzeczywistego i dlatego stara żeby to ocenić. Nie znajduje zadeklarowanej wartości domyślnej, aby wykonać połączenie.
Jeśli tak jest, jaki powinien być sposób wyrażania typu funkcji z niejawnymi parametrami?