Почему я не могу использовать фильтр для моей карты? - PullRequest
4 голосов
/ 03 марта 2012

Я получаю странную ошибку несоответствия типов в Scala при попытке сделать следующее:

val m = Map[String, Int]("a" -> 1, "b" -> 2, "c" -> 3)
val n = Map[String, Int]("c" -> 3, "d" -> 4, "e" -> 5)
n.filter((k: String, v: Int) => !m.contains(k))
<console>:10: error: type mismatch;
 found   : (String, Int) => Boolean
 required: (String, Int) => Boolean
              n.filter((k: String, v: Int) => !m.contains(k))

Я что-то не так делаю? Несоответствие типов здесь не имеет смысла.

Ответы [ 3 ]

14 голосов
/ 03 марта 2012

Фактический требуемый тип - ((String,Int)), то есть один аргумент - это Pair[String,Int], но ваш синтаксис передает два отдельных аргумента. Вместо этого вы можете передать частичную функцию, которая использует ключевое слово case для сопоставления пары:

n.filter { case(k, v) => !m.contains(k) }

Вот Соответствующая статья об этом.

Луиджи заслуживает поддержки за указание, что filterKeys является более подходящим методом для использования здесь.

9 голосов
/ 03 марта 2012

Бесполезное сообщение об ошибке - известная ошибка в Scala 2.9.

Что следует сказать, это

 found   : (String, Int) => Boolean
 required: ((String, Int)) => Boolean

т.е. Вы поставили Function2[String, Int, Boolean], когда filter требуется Function1[(String, Int), Boolean].

Вы можете использовать сопоставление с образцом для сопоставления на кортежах, как показывает Ник, напрямую предоставлять функцию кортежа, как показывает Томаш, или вы можете превратить Function2 в Function1, принимая кортеж, используя метод tupled:

n.filter(((k: String, v: Int) => !m.contains(k)).tupled)
// or
n.filter(Function.tupled((k, v) => !m.contains(k)))

Но лучше всего использовать встроенный метод filterKeys:

n.filterKeys(!m.contains(_))
4 голосов
/ 03 марта 2012

Попробуйте:

n.filter(entry => !m.contains(entry._1))

Где entry - это кортеж, содержащий (key, value), поэтому entry._1 - это ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...