Подтвердить что ты не робот

Scala: что означает передать Set для функции отображения набора

Я только что видел, что могу сделать:

Set(1, 2, 3).map(Set(1))

что дает результат:

Set(true, false)

Но я думал, что функция карты может принимать только другую функцию, а не новый набор. Если бы я ожидал, что это вернет набор наборов. Что происходит и что означает результат?

4b9b3361

Ответ 1

Но я думал, что функция map может использовать только другую функцию, а не новую Set.

A Set - функция. Это функция из своих элементов в booleans: когда вы передаете ей элемент, он сообщает вам, является ли этот элемент частью Set.

Set(1, 2, 3).map(Set(1))

Итерации по Set(1, 2, 3), передавая каждый элемент в Set(1). То есть он сначала спрашивает: "1 член набора {1}", который равен true, тогда он задает тот же вопрос для 2 и 3, который является false.

Таким образом, результат Set(true, false, false), который, конечно, просто Set(true, false).

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

Ответ 3

  • Set[A] extends Function1[A, Boolean].
  • Map[K, V] расширяет PartialFunction[K, V], который, в свою очередь, расширяет Function1[K, V].
  • Seq[A] extends PartialFunction[Int, A], который, в свою очередь, расширяет Function1[Int, A].

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

  • apply метод в Set[_] проверяет наличие набора.
  • apply метод в Map[_, _] возвращает значение, связанное с данным ключом. Выдает ошибку, если ключ отсутствует.
  • apply метод в Seq[_] возвращает элемент в заданном индексе. Выдает ошибку для недопустимого индекса.

Следующие два эквивалента:

Set(1, 2, 3).map(Set(1))

Set(1, 2, 3).map(x => Set(1).contains(x))

Итак, следующие два:

Seq(1, 2, 3).collect(someMap)

Seq(1, 2, 3) collect { 
  case x if someMap contains x => someMap(x)
}

А также следующие два:

Seq(1, 2, 3).map(someSeq)

Seq(1, 2, 3).map(x => someSeq(x))