Sto avendo un problema nella mia DSL con metodi generici overload conseguente compilatore me che vogliono aggiungere tipi di parametri espliciti:"Missing tipo di parametro" nel metodo generico sovraccarica di prendere un argomento di funzione
def alpha[T](fun: Int => T): String = fun(33).toString
def beta [T](fun: Int => T): String = fun(66).toString
def beta [T](thunk: => T): String = thunk.toString
alpha { _ + 11 } // ok
beta { _ + 22 } // "error: missing parameter type for expanded function"
beta { _: Int => _ + 22 } // ok... ouch.
Qualsiasi possibilità che può sbarazzarsi del disordine nell'ultima riga?
EDIT:
Per dimostrare che il sovraccarico non è un problema di ambiguità scalac di per sé, ecco una versione senza parametro di tipo che funziona perfettamente bene:
def beta(fun: Int => String): String = fun(66).reverse
def beta(thunk: => String): String = thunk.reverse
beta(_.toString) // ok
beta("gaga") // ok
Sì, perché l'argomento è Int => T. Scalac sa che nel caso di 'alpha', perché non lo riconosce nel caso di' beta'? –
Poiché 'beta' è sovraccarico, e ci sono due scelte, una delle quali richiede' Int => T' e un'altra che richiede '=> T'. Ecco perché è impossibile dire a quale di questi ti riferisci senza dirlo esplicitamente. Alpha funziona esattamente perché c'è una sola scelta. – rafalotufo
Questo non è vero. È un difetto derivante dall'avere un parametro di tipo. Non c'è alcuna ambiguità se chiamo il thunk o la versione della funzione se il metodo non è generico. Ho modificato la domanda per mostrarlo. –