2013-09-03 32 views
7

Chciałbym mieć funkcję wyższego rzędu, która przyjmuje parametr funkcji, która akceptuje określony niejawny parametr.Typ funkcji z parametrami Implicit w Scala

Dokładniej, próbuję utworzyć funkcję, która wymaga metody tworzenia Future, która zależy od niejawnego kontekstu i zwraca metodę, która nie zależy od kontekstu.

Aby być bardziej konkretne, powiedzmy, że mam coś takiego:

def foo(a: Int)(implicit ctx: ExecutionContext): Future[Float] = future { somelongBar... } 

chciałbym mają metody takie jak to:

def provideCtx[A](func: ExecutionContext => A): A = { 
    val ctx = setupCtx 
    func(ctx) 
} 

ale jeśli zadzwonię provideCtx(foo), z kompilator narzeka na brak kontekstu wykonywania niejawnego.

Fakt, że mam do czynienia z Kontekstem wykonania, nie jest bardzo ważny. To, co chciałbym znaleźć, to jak napisać typ parametru, aby zaakceptować funkcję z niejawnym argumentem określonego typu. Rozumiem, że część niejawna jest argumentem curry, tak więc faktycznie mam taką funkcję jak: ExecutionContext => Int => Future[Float], i jestem całkiem pewny, że w czasie wykonywania, jvm nie wie, że ten ExecutionContext jest niejawny, ale nie mogę spraw, aby kompilator to zrozumiał.

Odpowiedz

2

Problem polega na tym, że foo jest metodą, a nie funkcją, a rozszerzenie eta (które konwertuje metody na funkcje) nie jest podejmowane przed niejawnym zastosowaniem. Szczegółowe informacje na ten temat znajdują się w sekcji 6.26.2 specyfikacji językowej, a do dodatkowej dyskusji - this issue.

Jeden obejście byłoby napisać coś takiego:

provideCtx((ctx: ExecutionContext) => (a: Int) => foo(a)(ctx)) 

nie jestem pewien, że bardziej ogólne rozwiązanie jest możliwe (przynajmniej bez jakiejś refleksji, itd.), Ponieważ nie możemy nawet odwołaj się do foo (z wyjątkiem wywołania metody, oczywiście) bez domyślnego zakresu.

+0

Rzeczywiście, skończyłem pisać coś bardzo podobnego teraz, to tylko trochę uciążliwe. – Mortimer