2014-05-25 1 views
1

Cela fonctionne: (1 to 5).reduceLeft(_+_)J'ai trouvé des incohérences dans le trait de soulignement Scala

mais cela ne fait pas: (x:Int,y:Int)=>_+_

<console>:8: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2)) 
       (x:Int,y:Int)=>_+_ 
          ^
<console>:8: error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus(x$2)) 
       (x:Int,y:Int)=>_+_ 
          ^

Il semble incohérent, puisque dans le premier cas, la fonction anonyme (_+_) compilé avec succès, mais échoué pour le second cas.

Y a-t-il quelque chose qui me manque ou me trompe? Ou est-ce juste la définition de la syntaxe?

+0

vous vouliez probablement dire quelque chose comme: 'val f: Fonction2 [Int, Int, Int] = _ + _'? –

Répondre

9

Il n'y a pas d'incompatibilité. Dans le premier cas, vous créez fonction anonyme avec deux arguments qui sont ensuite ajoutés, c'est quelque chose comme ceci:

(1 to 5).reduceLeft((x, y) => x + y) 

Dans le second cas, cependant, vous créez la fonction anonyme qui un rendement anonyme fonction avec deux arguments:

(x: Int, y: Int) => ((a, b) => a + b) 

(Il semble que vous pensiez que (x: Int, y: Int) => _+_ est le même que (x: Int, y: Int) => x + y, ce qui est pas.)

Dans le sapin Dans le cas où vous avez utilisé _ + _ dans un contexte où les types de ses arguments sont connus (comme un paramètre de reduceLeft). Dans le second cas, vous semblez l'utiliser dans un contexte où le type des paramètres de la fonction interne ne peut pas être déduit, et c'est exactement ce que votre erreur est à propos.

+0

l'ai eu, j'utilise mal les traits de soulignement. Merci votre réponse très utile. –

+0

@WeiChing, vous êtes les bienvenus :) –

Questions connexes