2013-09-03 9 views
7

Mi piacerebbe avere una funzione di ordine superiore che accetta un parametro che accetta uno specifico parametro implicito.Tipo di funzione con parametri impliciti in Scala

Per essere più precisi, sto cercando di creare una funzione che utilizza un metodo di creazione Future che dipende da un contesto implicito e restituisce un metodo che non dipende dal contesto.

essere più concreti, diciamo che ho qualcosa di simile:

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

Vorrei fare avere un metodo come questo:

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

ma se chiamo provideCtx(foo), il il compilatore si lamenta del contesto di esecuzione implicito mancante.

Il fatto che si tratti di un ExecutionContext non è molto importante. Quello che vorrei trovare è come scrivere il tipo di parametro per accettare una funzione con un argomento implicito di un tipo specifico. Capisco che la parte implicita è un argomento curry, quindi in realtà ho una funzione come questa: ExecutionContext => Int => Future[Float], e sono abbastanza sicuro che in fase di esecuzione, jvm non sa che l'ExecutionContext è implicito, ma non posso fai capire al compilatore.

risposta

2

Il problema è che foo è un metodo, non una funzione, ed eta-espansione (che converte i metodi in funzioni) non viene tentata fino a dopo l'applicazione implicita. Vedere la sezione 6.26.2 delle specifiche della lingua per i dettagli e this issue per ulteriori discussioni.

Una soluzione potrebbe essere quella di scrivere qualcosa del genere:

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

Non sono sicuro che una soluzione più generica è possibile (almeno senza un qualche tipo di riflessione, ecc), dal momento che non possiamo fare anche riferimento a foo (tranne in una chiamata al metodo, ovviamente) senza un ambito implicito.

+0

infatti, ho finito per scrivere qualcosa di molto simile in questo momento, è solo un po 'macchinoso. – Mortimer

Problemi correlati