2015-09-22 12 views
8

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?

Odpowiedz

1

typ parametru f funkcjonować g jest Function1[Int, Unit]. Function1[A, B] jest cechą jednej metody: apply(a: A): B, gdzie a nie jest niejawny. W związku z tym nie można utworzyć wystąpienia Function1[Int, Unit] z foo - nie będzie on miał prawidłowego podpisu.

Powiązane problemy