Scala установить против карты для понимания - PullRequest
1 голос
/ 25 апреля 2020

Играя с Scala Я сталкиваюсь с этими двумя похожими кусочками кода, которые меня озадачивают:

val m = Map("a"->2D, "b"->3D)

for((k, v) <- m) yield (v, k)    // Yields Map(4.0 -> a, 3.0 -> b)
for(k <- m.keys) yield (m(k), k) // Yields Set((4.0,a), (3.0,b))
  1. Почему такое поведение?
  2. Возможно ли изменить второе понимание так, чтобы оно давало карту вместо набора?

Я чувствую, что здесь есть чему поучиться, любые дополнительные указатели приветствуются

1 Ответ

2 голосов
/ 25 апреля 2020

Напомним, что понимание for обессахаривается на вызовы map() и flatMap()withFilter()). В этом случае, поскольку в каждом из ваших примеров есть один генератор (<-), каждый из них становится одним вызовом map().

Также следует помнить, что map() вернет ту же монаду (тип оболочки), что и он был вызван.

В первом примере вы отображаете на Map, поэтому вы получаете Map назад: от Map[String,Double] до Map[Double,String]. Кортежи преобразуются в пары ключ-> значение.

Во втором примере вы отображаете Set элементов с помощью клавиш Map, поэтому вы получаете Set обратно , Преобразование кортежей не происходит. Они оставлены как кортежи.

Чтобы получить Map из второго примера, то есть, чтобы преобразовать кортежи, оберните весь for в скобки и пометьте .toMap в конце.

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