Tengo un código de Scala que hace algo ingenioso con dos versiones diferentes de una función con parámetros de tipo. He simplificado mucho esto desde mi aplicación pero al final mi código está lleno de llamadas al formulario w(f[Int],f[Double])
donde w()
es mi método mágico. Me encantaría tener un método más mágico como z(f) = w(f[Int],f[Double])
- pero no puedo obtener ninguna sintaxis como z(f[Z]:Z->Z)
para que funcione como me parece (como a mí) como los argumentos de función no pueden tener sus propios parámetros de tipo. Aquí está el problema como un fragmento de código Scala.¿Puede Scala permitir parámetros de tipo libres en los argumentos (son Scala Type Parameters ciudadanos de primera clase?)?
¿Alguna idea? Una macro podría hacerlo, pero no creo que esos sean parte de Scala.
object TypeExample {
def main(args: Array[String]):Unit = {
def f[X](x:X):X = x // parameterize fn
def v(f:Int=>Int):Unit = { } // function that operates on an Int to Int function
v(f) // applied, types correct
v(f[Int]) // appplied, types correct
def w[Z](f:Z=>Z,g:Double=>Double):Unit = {} // function that operates on two functions
w(f[Int],f[Double]) // works
// want something like this: def z[Z](f[Z]:Z=>Z) = w(f[Int],f[Double])
// a type parameterized function that takes a single type-parameterized function as an
// argument and then speicalizes the the argument-function to two different types,
// i.e. a single-argument version of w() (or wrapper)
}
}
¿Desea parametrizar el argumento de z? –
Sí, me gustaría que el argumento z() sea una función parametrizada (como mi f) y luego tenga z() vincula el parámetro tipo a dos valores diferentes. – jmount
Lo que sería totalmente rock sería un tipo de función que tomaría una función parametrizada f in y devolvería una clase con un miembro configurado en f [Int] y el otro en f [Doble]. – jmount