Estoy teniendo un problema en mi DSL con métodos genéricos sobrecargados resultantes en el compilador me quieren añadir tipos de parámetros explícitos:"Missing tipo de parámetro" en el método genérico sobrecargado teniendo un argumento de función
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.
Alguna posibilidad puede deshacerse del desorden en la última línea?
EDIT:
Para demostrar que la sobrecarga no es un problema de ambigüedad a scalac per se, aquí es una versión sin parámetro de tipo que funciona perfectamente bien:
def beta(fun: Int => String): String = fun(66).reverse
def beta(thunk: => String): String = thunk.reverse
beta(_.toString) // ok
beta("gaga") // ok
Sí, puede, porque el argumento es Int => T. Scalac sabe que en el caso de 'alfa', ¿por qué no lo sabe en el caso de' beta'? –
Porque 'beta' está sobrecargado, y hay dos opciones, una de las cuales toma' Int => T' y otra que toma '=> T'. Es por eso que es imposible saber a cuál de estos se refiere sin decirlo explícitamente. Alpha funciona exactamente porque solo hay una opción. – rafalotufo
Eso no es verdad. Es un defecto que es el resultado de tener un parámetro de tipo. No hay ambigüedad si llamo al thunk o la versión de la función si el método no es genérico. He editado la pregunta para mostrar esto. –