Ich habe etwas Scala-Code, der mit zwei verschiedenen Versionen einer typenparametrisierten Funktion etwas raffiniert macht. Ich habe dieses von meiner Anwendung sehr vereinfacht, aber am Ende ist mein Code voll von Anrufen des Formulars w(f[Int],f[Double])
, wo w()
meine magische Methode ist. Ich würde gerne eine magische Methode wie z(f) = w(f[Int],f[Double])
haben - aber ich kann keine Syntax wie z(f[Z]:Z->Z)
zu arbeiten, wie es aussieht (für mich) wie Funktionsargumente kann nicht ihre eigenen Typparameter haben. Hier ist das Problem als Scala-Code-Snippet.Kann Scala freie Typparameter in Argumenten erlauben (sind Scala-Typparameter Bürger erster Klasse?)?
Irgendwelche Ideen? Ein Makro könnte das machen, aber ich glaube nicht, dass das ein Teil von Scala ist.
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)
}
}
Sie möchten, dass das Argument von z parametrisiert wird? –
Ja, ich möchte, dass das Argument von z() eine parametrisierte Funktion ist (wie mein f) und dann z() den Typparameter an zwei verschiedene Werte bindet. – jmount
Was würde total rocken wäre eine Funktion, die eine parametrisierte Funktion f in nehmen und eine Klasse mit einem Mitglied auf f [Int] und die andere auf f [Double] zurückgeben würde. – jmount