Несоответствие Scala при составлении карты - PullRequest
5 голосов
/ 11 января 2012

Я делаю свои первые интересные шаги (не относящиеся к миру) с помощью Scala (2.9.1), и я застреваю, пытаясь понять очень неинформативное сообщение об ошибке. Это выглядит примерно так:

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

Как вы можете догадаться, в этом фрагменте процесса предполагается, что происходит некоторая обработка, и на самом деле это четко определенная функция с сигнатурой Array[InputEntry] => Double.

Подпись Групера вместо этого Array[InputEntry] => Int.

Я пытался извлечь функцию и заменить лямбду, но это было бесполезно, и я застрял, пытаясь понять вопросительный знак в ошибке ...

Есть идеи?

Редактировать: Я должен уточнить, что InputEntry - это класс, который я определил, но ради этого примера мне кажется, что он вряд ли уместен.

1 Ответ

14 голосов
/ 11 января 2012

Это выглядит как проблема:

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

Вам нужно использовать оператор case, чтобы отменить применение параметров и назначить их локальным переменным. Вам также нужно использовать {} вместо (), потому что теперь это анонимная функция.

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

Вот более простой пример.

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)

Если вы не хотите использовать оператор case, вы должны сохранить кортеж как одну переменную.

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