J'ai besoin d'un contrôle de retour (s'il vous plaît).Comment spécialiser un argument de type paramétré à plusieurs types différents dans Scala?
Dans un article (http://www.win-vector.com/blog/2010/06/automatic-differentiation-with-scala/) je viens d'écrire que j'ai déclaré que je crois en Scala que vous ne pouvez pas spécifier une fonction qui prend un argument qui est lui-même une fonction avec un paramètre de type non lié. J'ai modifié cette question pour essayer de simplifier l'exemple.
Le code suivant fonctionne en introduisant un trait GenericFn qui imite le trait Scala Fonction1, sauf qu'il a un paramètre de type libre dans la fonction:
object TypeExample {
trait NumberBase {
def result:String
}
class A extends NumberBase {
def result = "A"
}
class B extends NumberBase {
def result = "B"
}
trait GenericFn {
def apply[X<:NumberBase](x:X):String
}
def specializeAndApplyTwice(f:GenericFn):String = {
f[A](new A()) + f[B](new B())
}
def main(args : Array[String]) : Unit = {
val f = new GenericFn {
def apply[X<:NumberBase](x:X):String = { x.result }
}
println(specializeAndApplyTwice(f))
}
}
Cela fonctionne, mais est-il un moyen de le faire sans le trait GenericFn (utiliser une notation de fonction standard)? Par exemple, le code échoue ci-dessous avec l'erreur de compilation: "incompatibilité de type Trouvée: TypeExample2.A requis: _ 1 $ _ où type 1 < $: TypeExample2.NumberBase":
def specializeAndApplyTwice(f:(_<:NumberBase)=>String):String = {
f(new A()) + f(new B())
}
Votre exemple devrait probablement être: def g (f: Array [Double] => Double, x: Array [Double]): Double –
... et peut-être, le second exampe doit être def g (f [Y] : Array [Y] => Y, x: Array [Y]): Y? Sinon, vous pourriez écrire def g (f: Array [_] => Double, x: Array [Double]): Double, mais je suppose que ce n'est pas ce que vous voulez. –
Arjan, en fait mes exemples sont plus proches de ce que je veux. Dans mon code actuel Y a une contrainte de type (que je n'ai pas reproduite ici) de la forme Y <: NumberBase [Y] et NumberBase [Y] déclare des méthodes de conversion de et vers Y et Doubles. g() utilise cette structure pour effectuer une conversion ascendante des doublons machine en Y, travailler et ensuite convertir en double (le code extérieur ne sélectionne donc pas le type Y et n'a pas besoin de traiter le type Y). – jmount