2010-08-17 6 views
2

Je ne sais pas pourquoi cela ne fonctionne pas:fonctions anonymes et des cartes dans Scala

scala> case class Loader(n: String, x: String, l: List[String]) 
scala> val m: Map[String, (List[String])=>Loader] = 
    | Map("x" -> Loader("x", "x1", _:List[String]))    

<console>:8: error: type mismatch; 
found : (List[String]) => (java.lang.String, Loader) 
required: (String, (List[String]) => Loader) 
     Map("x" -> Loader("x", "x1", _:List[String])) 

mais cela fait?

scala> Loader("t", "x", _:List[String]) 
res7: (List[String]) => Loader = function1> 

scala> val m = Map("x" -> res7) 
m: scala.collection.immutable.Map[java.lang.String,(List[String]) => Loader] = 
    Map((String,function1>)) 

Répondre

4

L'analyseur ne savait pas où placer le début de la fonction anonyme. Parfois, vous pouvez résoudre ce problème en ajoutant une autre paire de parenthèses (mais pas toujours):

val m: Map[String, (List[String])=>Loader] = 
Map("x" -> (Loader("x", "x1", _:List[String]))) 

je ne vois pas d'ambiguïtés ici, il pourrait tout simplement pas été assez intelligent pour comprendre. Je pense, l'analyseur a négligé la possibilité d'avoir une fonction anonyme juste après le -> (qui est également une construction de bibliothèque et utilise implicite magie et tous les trucs de guichet qui fait la boucle de l'esprit du petit analyseur). Lorsque vous l'écrivez en tant que ligne explicite, cela fonctionne correctement.

val m: Map[String, (List[String])=>Loader] = 
Map(("x", Loader("x", "x1", _:List[String]))) 
+0

Thx. Oui, j'ai remarqué la même chose ... que ça a marché avec Tuples. – Vonn

5

Encore une victime de la surcharge de _ à Scala. Considérez ceci:

f(_, 5) + 1 // Partial function application 
f(_ + 1, 5) // Closure 

Dans le premier cas, _ remplace le paramètre entier. Dans ce cas, il s'agit d'une application partielle de f. En pratique, il est équivalent à x => f(x, 5) + 1, car toute l'expression contientf est transformé en une fermeture. Dans le deuxième cas, _ fait partie d'une expression. Dans ce cas, l'expression entière est transformée en une fermeture, jusqu'à un délimiteur d'expression - par lequel je veux dire que si l'expression est imbriquée dans un autre, seule l'expression interne est transformée en une fermeture. En pratique, il est équivalent à f(x => x + 1, 5).

Questions connexes