Scala Анонимные функции вопрос - PullRequest
4 голосов
/ 23 августа 2011

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

Если я добавлю в REPL следующее:

scala> val myMap = Map("a" -> 1, "b" -> 2, "c" -> 3)
myMap: scala.collection.immutable.Map[java.lang.String,Int] = 
| Map(a -> 1, b -> 2, c -> 3)

Пока все нормально, и это работает ...

scala> myMap.filter(_._2 > 1)
res9: scala.collection.immutable.Map[java.lang.String,Int] = Map(b -> 2, c -> 3)

, но это не удается ...

scala> myMap.filter((k:java.lang.String, v:Int) => v > 1)
<console>:9: error: type mismatch;
 found   : (java.lang.String, Int) => Boolean
 required: ((java.lang.String, Int)) => Boolean
   myMap.filter((k:java.lang.String, v:Int) => v > 1)

Мой вопрос: что происходит с сообщением об ошибке и дополнительной парой скобок?Если я пытаюсь вставить дополнительный набор скобок, я получаю сообщение об ошибке: недопустимый формальный параметр.

Ответы [ 2 ]

16 голосов
/ 23 августа 2011

myMap.filter ожидает функцию типа Tuple2[String, Int] => Boolean, которая эквивалентна ((String, Int)) => Boolean. Вы передаете ему функцию типа (String, Int) => Boolean; то есть функция, которая принимает два аргумента, а не один Tuple2.

Два способа заставить его работать:

 myMap.filter { case (k, v) => v > 1 }

и

 myMap.filter(Function.tupled((k, v) => v > 1))

Первый работает путем сопоставления с образцом, а второй - путем преобразования функции (String, Int) => Boolean в ((String, Int)) => Boolean.

Кстати, обсуждался вопрос объединения списков аргументов и функций. Возможно, в будущей версии Scala все функции будут принимать один параметр (который может быть кортежем).

6 голосов
/ 23 августа 2011

filter принимает функцию, которая принимает только один параметр. В вашем выражении выражение принимает два параметра. Тем не менее, элемент оказывается парой, поэтому вы можете подумать, что можете дать два параметра. Правильный способ выразить это будет что-то вроде:

myMap.filter (p => p._2 > 1)

То есть я получаю пару p, а ее второй элемент должен быть больше 1.

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