2013-09-03 9 views
7

Ich möchte eine Funktion höherer Ordnung haben, die Parameter in eine Funktion aufnimmt, die einen bestimmten impliziten Parameter akzeptiert.Typ einer Funktion mit impliziten Parametern in Scala

Um genauer zu sein, ich versuche, eine Funktion, die eine Future Erstellungsmethode, die von einem impliziten Kontext abhängt und eine Methode, die nicht abhängig von dem Kontext.

Um konkreter zu sein, lassen Sie uns sagen, dass ich so etwas wie dieses:

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

Ich möchte eine Methode, wie dies zu tun:

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

aber wenn ich provideCtx(foo) nennen, die Compiler beschwert sich über den impliziten Ausführungskontext fehlt.

Die Tatsache, dass es sich um einen ExecutionContext handelt, ist nicht sehr wichtig. Ich möchte herausfinden, wie man den Parametertyp schreibt, um eine Funktion mit einem impliziten Argument eines bestimmten Typs zu akzeptieren. Ich verstehe, dass der implizite Teil ein curryed Argument ist, so dass ich tatsächlich eine Funktion wie folgt habe: ExecutionContext => Int => Future[Float], und ich bin ziemlich sicher, dass der jvm zur Laufzeit nicht weiß, dass ExecutionContext implizit ist, aber ich kann nicht Machen Sie das dem Compiler verständlich.

Antwort

2

Das Problem ist, dass foo eine Methode ist, keine Funktion, und Eta-Erweiterung (die Methoden in Funktionen konvertiert) wird erst nach impliziter Anwendung versucht. Weitere Einzelheiten finden Sie in Abschnitt 6.26.2 der Sprachspezifikation und unter this issue.

Eine Abhilfe wäre, so etwas zu schreiben:

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

Ich bin nicht sicher, eine generische Lösung möglich ist (zumindest ohne irgendeine Art von Reflexion, etc.), da können wir nicht beziehen Sie sich sogar auf foo (außer in einem Methodenaufruf, natürlich) ohne einen impliziten Bereich.

+0

In der Tat habe ich etwas sehr ähnliches geschrieben, es ist nur ein bisschen umständlich. – Mortimer

Verwandte Themen