2010-06-15 6 views
4

Je suis tombé sur une erreur sur mon code Scala que je ne peux pas résoudre par moi-même (je suis nouveau chez Scala). J'ai le code suivant:Pourquoi est-ce que le type de modèle est incompatible avec le type attendu?

def myFunction(list: List[Any]): String = { 
    var strItems : String = ""; 
    list.foreach(item => { 
    strItems += item match { 
     case x:JsonSerializable => x.toJson() 
     case y:String => ("\"" + y + "\"") 
     case _ => item.toString 
    } 
    if(item != list.last) 
     strItems += ","; 
    }) 
    strItems; 
} 

L'erreur que je reçois est:

erreur: type de motif est incompatible avec le type attendu; trouvé: String requis: Unité cas y: String => ("\" "+ y + "\"")

Toute idée pourquoi?

PS: est-il un moyen plus performant au code maFonction

Répondre

7

En termes de la question initiale, le code ne fonctionne pas c ompile parce qu'il nécessite des parenthèses autour du match, ie. strItems += (item match { ... })

Une plus « fonctionnelle » façon d'écrire cela pourrait être quelque chose le long des lignes de:

def myFunction(list:List[Any]):String = { 
    val strings:List[String] = list.map{ 
    case x:JsonSerializable => x.toJson() 
    case y:String => ("\"" + y + "\"") 
    case z => z.toString 
    } 
    strings.mkString(",") 
} 

Vous pouvez probablement utiliser une vue pour le rendre paresseux et plus « performant », bien que je ne suis pas connaître le haut de ma tête si cela combinerait les deux boucles sous-jacentes (map & mkString) en une seule traversée.

+3

L'utilisation de 'view' transformerait' map' & 'mkString' en une seule traversée. –

0

Voici une forme de votre code qui compile (w/o toute définition pour JsonSerializable) (en Scala 2.8) ainsi que d'une formulation plus succincte (qui a également arrive à être point gratuit):

object Javier01 { 
    def 
    javFunc(list: List[Any]): String = { 
    val strItems = new StringBuilder() 

    list.foreach { item => 
     strItems.append (item match { 
//  case x: JsonSerializable => x.toJson() 
     case y: String => "\"" + y + "\"" 
     case _ => item.toString 
     }) 

     if (item != list.last) 
     strItems.append(",") 
    } 
    strItems.toString 
    } 

    def 
    rrsFunc(anys: List[Any]): String = 
    anys map { 
// case x: JsonSerializable => x.toJson() 
     case s: String => "\"" + s + "\"" 
     case x => x.toString 
    } mkString "," 


    def 
    main(args: Array[String]): Unit = { 
    val stuff = List(true, 1, 123.456, "boo!") 

    printf("  stuff : %s%njavFunc(stuff): %s%nrrsFunc(stuff): %s%n%n", 
      stuff, javFunc(stuff), rrsFunc(stuff)) 
    } 
} 

la sortie de l'exécution de c'est:

% scala Javier01 
     stuff : List(true, 1, 123.456, boo!) 
javFunc(stuff): true,1,123.456,"boo!" 
rrsFunc(stuff): true,1,123.456,"boo!" 
Questions connexes