Есть ли какая-нибудь концепция, лежащая в основе передачи неизменяемой карты Scala в функцию карты? - PullRequest
0 голосов
/ 23 октября 2019

В строке № 2 "pws" Карта передается методу карты, как получается, что она заменяет значения для этого ключа? Может кто-нибудь объяснить, как это работает внутри?

scala> val pws = Map ("Apache Spark" -> "http://spark.apache.org/"," Scala "->" http://www.scala -lang. org /") pws: scala.collection.immutable.Map [String, String] = Карта (Apache Spark -> http://spark.apache.org/, Scala -> http://www.scala -lang.org / )

scala> val sites = sc.parallelize (Seq ("Apache Spark", "Scala")). Map (pws) .collect ... sites: Array [String] = Array (http://spark.apache.org/, http://www.scala -lang.org / )

/ * для лучшего понимания * /

scala> val sites = sc.parallelize (Seq ("Apache Spark "," Scala ")) веб-сайты: org.apache.spark.rdd.RDD [String] = ParallelCollectionRDD [6] при распараллеливании по адресу: 24

scala> sites.first () res10: String =Apache Spark

scala> pws

res11: scala.collection.immutable.Map [String, String] = Карта (Apache Spark -> http://spark.apache.org/, Scala -> http://www.scala -lang.org / )

scala> val sites = sc.parallelize (Seq ("Apache Spark", "Scala")). Map (pws) sites: org.apache.spark.rdd.RDD [String] = MapPartitionsRDD [8] на карте по адресу: 26

scala> website.first ()

res12: String = http://spark.apache.org/

[Почему «Apache Spark» (первое значение) заменено на «http://spark.apache.org/"]

1 Ответ

2 голосов
/ 23 октября 2019

Существует ли какой-либо концепт, позволяющий передать неизменяемый Scala Map в функцию карты

Этот концепт называется «подтип»:

  1. scala.collection.immutable.Map[K, +V] расширяется scala.collection.immutable.MapOps[K, V, scala.collection.immutable.Map, scala.collection.immutable.Map[K, V]]
  2. scala.collection.immutable.MapOps[K, +V, +CC[X, +Y] <: MapOps[X, Y, CC, _], +C <: MapOps[K, V, CC, C]] (где CC = scala.collection.immutable.Map и C = scala.collection.immutable.Map[K, V]) расширяется scala.collection.MapOps[K, V, CC, C ]
  3. scala.collection.MapOps[K, +V, +CC[_, _] <: IterableOps[_, collection.AnyConstr, _], +C] (где CC = scala.collection.immutable.Map и C = scala.collection.immutable.Map[K, V]) расширяется scala.PartialFunction[K, V]
  4. scala.PartialFunction[-A, +B] (где A= K и B = V) расширяет (A) ⇒ B (что является синтаксическим сахаром для scala.Function1[A, B])

Итак, другими словами: Map[K, +V] s - это Function1[K, +V] с, поэтому вы можете передать Map методу, ожидающему Function1 в качестве аргумента. B):CC[B]" rel="nofollow noreferrer">scala.collection.immutable.Seq[+A].map[B] ожидает аргумент типа (A) ⇒ B, а Map равен (подтип) этого типа. И так как я могу передать экземпляр подтипа в любом месте, я могу передать экземпляр супертипа без изменения смысла программы (это то, что нам гарантирует принцип подстановки Лискова *), чтохорошо напечатан и действителен.

Подумайте об этом: что такое функция? Функция - это отображение входов на выходы . Вы даете функции входной аргумент, функция выдает результат в качестве возвращаемого значения.

Что такое карта? Это отображение ключей на значения. Вы даете карте ключевой аргумент, карта дает вам значение в качестве возвращаемого значения.

Они очень одно и то же .

Аналогичные рассуждения применимы к Seq s: последовательность представляет собой отображение натуральных чисел на элементы. И для Set s: набор - это отображение элементов на логические значения.

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