2011-05-12 4 views
4

je le code suivant:Scala soulignent l'utilisation pour simplifier la syntaxe des littéraux de fonction

var x = Array(1,3,4,4,1,1,3) 
var m = Int.MaxValue 
x.foreach((x)=>(m = m min x)) 

J'ai essayé de simplifier la dernière phrase:

x.foreach((m = _ min m)) 

Mais l'interprète dit:

scala> x.foreach((m = _ min m))  
<console>:8: error: missing parameter type for expanded function ((x$1) => x$1.min(m)) 
    x.foreach((m = _ min m)) 
       ^

J'ai essayé d'être plus explicite sur le type:

scala> x.foreach((m = (_:Int) min m)) 
<console>:8: error: type mismatch; 
found : (Int) => Int 
required: Int 
    x.foreach((m = (_:Int) min m)) 
         ^

Le compilateur et je ne comprends pas l'autre :(

Meilleures salutations,

Stan

+0

Il semble que '=' délimite l'expression. Je ne m'attendais pas à ce que cela se produise ... Et j'ai _did_ testé le code, mais il ne fonctionne évidemment pas, alors j'ai supprimé ma réponse. –

Répondre

3

D'abord, notez que

val m = x.min 

fait ce que vous voulez, comme fait

val m = (Int.MaxValue /: x)(_ min _) 

Je vais vous laisser pour en savoir plus sur ces choses (la méthode min sur les collections, et les plis; notez que ceux-ci ne sont pas aussi rapides que ce que vous avez écrit). Le problème est que le compilateur se perd avec ce que vous voulez dire et avec quels types valides peuvent être quand vous écrivez le trait de soulignement, et quand vous ajoutez l'information de type il pense que vous essayez d'écrire une fonction et attribuez-le à m. Mais bien sûr m est un Int, pas une fonction, donc il se plaint.

Il suffit de l'écrire explicitement. Ce ne sont que quelques caractères supplémentaires:

x.foreach(i => m = m min i) 
+0

Merci Rex! J'essayais de comprendre les détails des expressions simplificatrices en utilisant le trait de soulignement, plus que de calculer le minimum. Votre solution: val m = (Int.MaxValue /: x) (_ min _), est très soignée! À votre santé! – Stan

Questions connexes