Пример в Scala метода hashmap forall ()? - PullRequest
4 голосов
/ 19 мая 2011

Может кто-нибудь привести пример использования метода HashMap forall ()?Я считаю документы Scala непроницаемыми.

То, что я хочу, выглядит примерно так:

val myMap = HashMap[Int, Int](1 -> 10, 2 -> 20) 
val areAllValuesTenTimesTheKey = myMap.forall((k, v) => k * 10 == v)

, но это дает:

error: wrong number of parameters; expected = 1

Ответы [ 3 ]

12 голосов
/ 19 мая 2011

Вам нужно вместо

val myMap = HashMap[Int, Int](1 -> 10, 2 -> 20) 
val areAllValuesTenTimesTheKey = myMap.forall { case (k, v) => k * 10 == v }

Проблема в том, что forall хочет функцию, которая принимает один Tuple2, а не два аргумента. (Мы думаем о Map[A,B] как Iterable[(A,B)], когда используем forall.) Использование оператора case - хороший обходной путь; здесь действительно используется сопоставление с шаблоном, чтобы разделить Tuple2 и дать названия деталей.

Если вы не хотите использовать сопоставление с образцом, вы могли бы также написать

val areAllValuesTenTimesTheKey = myMap.forall(p => p._1 * 10 == p._2 }

но я думаю, что это менее полезно.

8 голосов
/ 19 мая 2011

forall передается один (Int, Int) кортеж (в отличие от нескольких параметров).Обратите внимание на это (которое явно показывает, что одно значение кортежа разлагается):

val areAllValuesTenTimesTheKey = myMap.forall(t => t match { case (k, v) => k * 10 == v })

Или сокращение (которое на самом деле передает функцию PartialFunction):

val areAllValuesTenTimesTheKey = myMap.forall {case (k, v) => k * 10 == v}

(Эти оба разлагаютсяприем кортежа.)

Кроме того, функция может быть "кортежирована". ed:

val myMap = Map((1,10), (2,20))
val fn = (k: Int, v: Int) => k * 10 == v
val tupled_fn = fn.tupled
val areAllValuesTenTimesTheKey = myMap.forall(tupled_fn)

myMap: scala.collection.immutable.Map[Int,Int] = Map((1,10), (2,20))
fn: (Int, Int) => Boolean =          // takes in two parameters
tupled_fn: ((Int, Int)) => Boolean = // note that it now takes in a single Tuple
areAllValuesTenTimesTheKey: Boolean = true

Счастливое кодирование.

3 голосов
/ 19 мая 2011

Проблема с вашим кодом в том, что вы предоставляете методу forall функцию, которая принимает 2 аргумента и возвращает Boolean или, другими словами, (Int, Int) => Boolean.Если вы посмотрите в документации, то найдете эту подпись:

def forall (p: ((A, B)) => Boolean): Boolean

, в этом случае forall метод ожидает Tuple2[A, B] => Boolean, поэтому его также можно записать так:

def forall (p: Tuple2[A, B] => Boolean): Boolean

Чтобы исправить пример, вы можете либо вызвать forall и присвоить ему функцию, которая принимает 1 аргумент кортежа:

myMap.forall(keyVal => keyVal._1 * 10 == keyVal._2)

, либо вы сопоставляете шаблоны и извлекаете ключ и значение:

myMap.forall {case (k, v) => k * 10 == v}

В этом случае вы даете PartialFunction[(Int, Int), Boolean] методу forall

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