2012-01-10 3 views
5

Sto prendendo i miei primi passi interessanti (non-ciao-livello mondiale) con Scala (2.9.1) e sono bloccato cercando di capire un messaggio di errore molto disinformativo. Va molto simile a questo:Scala mismatch durante l'associazione Mappa

error: type mismatch; 
found : (Int, Array[InputEntry]) => (Int, Double) 
required: (Int, Array[InputEntry]) => ? 
entries.groupBy(grouper).map((k: Int, ies: Array[InputEntry]) => (k, doMyStuff(ies))) 

Come si può intuire processo in questo frammento di codice dovrebbe essere dove alcuni di elaborazione va avanti, ed è in realtà una funzione ben definita con la firma Array[InputEntry] => Double.

La firma di un grouper, invece, è Array[InputEntry] => Int.

Ho cercato di estrarre una funzione e sostituire il lambda ma era inutile, e mi sono bloccato cercando di capire il punto di domanda nell'errore ...

Tutte le idee?

Modifica: Devo chiarire che InputEntry è una classe che ho definito, ma per il gusto di questo esempio mi sembra che sia poco pertinente.

+0

Abbiamo bisogno di vedere un po 'del codice. La parte del codice che è stata stampata con il messaggio di errore non è sufficiente. In particolare, qual è il tipo di firma di 'doMyStuff' e quale tipo di variabile stai cercando di scrivere il risultato? –

+0

Sei sicuro che il messaggio di errore non dice 'obbligatorio: ((Int, Lista [InputEntry]) =>?' –

+0

Suppongo che avrei dovuto rendere più specifico che le voci sono una mappa. Grazie comunque – em70

risposta

12

Questo appare come il problema:

.map((k: Int, ies: Array[InputEntry]) => (k, doMyStuff(ies))) 

è necessario utilizzare una dichiarazione caso annullare l'applicazione dei params e assegnarli alle variabili locali. Devi anche usare {} invece di() perché ora è una funzione anonima.

entries.groupBy(grouper).map{case (k, ies) => (k, doMyStuff(ies))} 

Ecco un esempio più semplice.

scala> val x = List(("a",1),("b",2)) 
x: List[(java.lang.String, Int)] = List((a,1), (b,2)) 
scala> x.map{ case (str, num) => num } 
res5: List[Int] = List(1, 2) 

Se non si desidera utilizzare una dichiarazione caso, è necessario mantenere la tupla come una singola variabile.

scala> x.map(tuple => tuple._2) 
res6: List[Int] = List(1, 2) 
+0

-1: quella parte del codice è giusta. –

+0

Whoops I'm wrong: ha segnalato il messaggio di errore errato. Una volta che hai reso conto di questo, in realtà dovrei dare un +1 invece. –

+1

Il bug corrispondente è contrassegnato come fisso, quindi non dovrebbe essere presente nella prossima versione: https://issues.scala-lang.org/browse/SI-5067 –