Почему мои типы Scala не совпадают?
Вопрос
У меня есть следующая переменная series
:
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")
}
)
К сожалению, я получаю ошибку компилятора при использовании следующего метода, который принимает новую точку данных и обновляет series
с новым List[FlotSeries]
основано на новых данных и старых сериях.
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
}
}
}
)
}
Компилятор Scala прерывает переназначение, потому что обнаруживает несоответствие типов:
error: type mismatch;
found : Unit
required: List[net.liftweb.widgets.flot.FlotSerie]
series = series.map(serie => serie match {
Что я здесь делаю не так?Похоже, что он должен возвращать список [FlotSeries], который может быть назначен series
.Поскольку компилятор находит Unit
Я думал о том, как foreach
всегда возвращается Unit
, Я всего лишь match
оператор возвращает последнее значение сопоставленного выражения, а не Unit
.
Решение
Присваивания в Scala возвращают единицу измерения (она же Scala, не совсем null null), в отличие от Ruby, который возвращает присвоенное значение.Ваш метод пытается вернуть единицу измерения вместо списка [FlotSerie].
Добавить:
return series
к вашему методу или измените его на возвращаемую единицу измерения.
Вы также могли бы упростить свой код, используя классы case и правильное сопоставление, если это уместно:
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
}
Я сам довольно новичок в Scala, так что YMMV.
Другие советы
удалить series =
вам назначена функция map для series, и вы ничего не возвращаете.