2014-09-29 3 views
0

Используя этот код:Scala Тип возвращаемого missmatch

val kv: HashMap[Int, Double] = HashMap[Int, Double]() 
val temp = valuesList.list.foreach { (id: Int, value: Option[Double]) => 
    val kvValue: Double = kv.getOrElse(id, 0) 
    val nvValue: Double = value.getOrElse(0) 
    val nv = kvValue + nvValue 
    kv.put(id, nv) 
} 

Я получаю эту ошибку:

type mismatch; 
found : (Int, Option[Double]) => Option[Double] 
required: ((Int, Option[Double])) => ? 

Не могу найти решение ...

+1

Какой смысл пытаться использовать 'kv', если он объявлен пустым? 'getOrElse' всегда будет возвращать то, что находится в параметрах, так как оно пустое –

+1

@ ElectricCoffee это просто пример? Но более идиоматично: 'val kv = mutable.Map [Int, Double]()' или 'val kv = mutable.HashMap.empty [Int, Double]' –

+1

@ som-snytt больше идиоматического будет не использовать изменчивые данные на самом деле, и используйте 'map', а не' foreach', чтобы собрать коллекцию, а не мутировать одну. –

ответ

1

Я думаю, вы даете неправильный тип вашей функции.

valuesList, вероятно, список кортежей. То есть, List[(Int, Option[Double])].

Таким образом, foreach дает кортеж вашей анонимной функции, а не Int и Option.

Быстрое решение использует case для создания частичной функции, которая подталкивает компилятор для распаковки кортежа для вас.

import scala.collection.mutable.HashMap 

val kv: HashMap[Int, Double] = HashMap[Int, Double]() 
val valuesList = List(1-> Option(1.0)) 

val temp = valuesList foreach { 
    case (id: Int, value: Option[Double]) => 
    val kvValue: Double = kv.getOrElse(id, 0) 
    val nvValue: Double = value.getOrElse(0) 
    val nv = kvValue + nvValue 
    kv.put(id, nv) 
} 

println(kv) 
// gives Map(1 -> 1.0) 

Удостоверьтесь, что я изменил valuesList здесь.

+0

Если вы не знакомы с частичной функцией, это хорошая статья об этом. (Http://blog.bruchez.name/2011/10/scala-partial-functions-without-phd.html) –

+0

изменяемые данные, как правило, считается плохой практикой, хотя –

Смежные вопросы