2012-01-10 15 views
5

Estoy dando mis primeros pasos interesantes (nivel no hola-mundo) con Scala (2.9.1) y estoy atascado tratando de entender un mensaje de error muy poco informativo. Va mucho como esto:Scala no coincide con el mapeo Mapa

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))) 

Como se puede adivinar proceso en este fragmento se supone que es donde algunos procesado continúa, y es en realidad una función bien definida con la firma Array[InputEntry] => Double.

La firma de Grouper, en cambio, es Array[InputEntry] => Int.

He intentado extraer una función y reemplazar el lambda pero era inútil, y yo estoy atascado tratando de comprender el signo de interrogación en el error ...

¿Alguna idea?

Edit: Debo aclarar que InputEntry es una clase que he definido, pero por el bien de este ejemplo, me parece que es poco relevante.

+0

Necesitamos ver algunos de los códigos. La parte del código que se imprimió con el mensaje de error no es suficiente. En particular, ¿cuál es la firma tipo de 'doMyStuff', y qué tipo de variable estás tratando de escribir el resultado? –

+0

¿Está seguro de que el mensaje de error no dice 'requerido: ((Int, List [InputEntry])) =>?' –

+0

Creo que debería haber hecho más específico que las entradas sean un Mapa. Gracias de todos modos – em70

Respuesta

12

Esto parece el problema:

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

Es necesario utilizar una declaración de caso cancelar la aplicación de los parametros y asignarlos a variables locales. También necesita usar {} en lugar de() porque ahora es una función anónima.

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

Aquí hay un ejemplo más simple.

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) 

Si no desea utilizar una declaración de caso, usted tiene que mantener la tupla como una sola variable.

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

-1: Esa parte del código es correcta. –

+0

Vaya, estoy equivocado: informó que el mensaje de error era incorrecto. Una vez que cuenta esto, debería dar un +1 en su lugar. –

+1

El error correspondiente está marcado como fijo, por lo que no debería estar allí en la próxima versión: https://issues.scala-lang.org/browse/SI-5067 –

Cuestiones relacionadas