¿Por qué mis tipos Scala no coincidentes?
Pregunta
Tengo el siguiente series
variables:
var series: List[FlotSerie] = List(
new FlotSerie() {
override val label = Full("Min")
},
new FlotSerie() {
override val label = Full("Max")
},
new FlotSerie() {
override val label = Full("Avg")
}
)
Por desgracia, estoy consiguiendo un error del compilador con el método siguiente, que toma un nuevo punto de datos y actualizaciones series
con un nuevo List[FlotSeries]
en base a los nuevos datos y la vieja serie.
def updateSeries(sample: Sample): List[FlotSerie] = {
series = series.map(serie =>
serie match {
case item if item.label == Full("Min") => {
new FlotSerie() {
override val label = item.label
override val data = (sample.timestamp.toDouble, sample.min) :: serie.data
}
}
case item if item.label == Full("Max") => {
new FlotSerie() {
override val label = item.label
override val data = (sample.timestamp.toDouble, sample.max) :: serie.data
}
}
case item if item.label == Full("Avg") => {
new FlotSerie() {
override val label = item.label
override val data = (sample.timestamp.toDouble, sample.avg) :: serie.data
}
}
}
)
}
El compilador Scala se ahoga con la reasignación porque encuentra una coincidencia de tipos:
error: type mismatch;
found : Unit
required: List[net.liftweb.widgets.flot.FlotSerie]
series = series.map(serie => serie match {
¿Qué estoy haciendo mal aquí? Parece que hay que devolviendo una lista [FlotSeries] que se puede asignar a series
. Desde el compilador encuentra Unit
pensé en cómo foreach
siempre devuelve Unit
, no soy más que el operador match
devuelve el último valor de la expresión coincidente, no Unit
.
Solución
Las asignaciones en la Unidad de retorno Scala (también conocido como Scala no es nulo absolutamente nula), a diferencia de Ruby que devuelve el valor asignado. Su método está intentando devolver la unidad en lugar de la lista [FlotSerie].
Añadir:
return series
a su método, o cambiarlo para devolver la unidad.
También puede simplificar el código usando las clases de casos y una correcta adecuación si es apropiado:
case class FlotSerie(label:Full, data:List[Tuple2[Double, Double]])
var series: List[FlotSerie] = List( FlotSerie(Full("Min"), Nil), FlotSerie(Full("Max"), Nil), FlotSerie(Full("Avg"), Nil) )
def updateSeries(sample: Sample): List[FlotSerie] = {
series = series.map(serie => {
serie.label match {
case Full("Min") => FlotSerie(serie.label, (sample.timestamp.toDouble, sample.min) :: serie.data)
case Full("Max") => FlotSerie(serie.label, (sample.timestamp.toDouble, sample.max) :: serie.data)
case Full("Avg") => FlotSerie(serie.label, (sample.timestamp.toDouble, sample.avg) :: serie.data)
}
})
return series
}
Soy bastante nuevo para mí mismo así Scala tu caso es distinto.
Otros consejos
eliminar series =
que ha asignado la función de mapa de series y no devolver nada.