Как доходность для понимания работает в Scala? - PullRequest
0 голосов
/ 10 января 2019

Прочитав эту статью и понял, что примерно все функции после ключевого слова yield являются map функцией. В то время как все операторы в пределах for являются flatMap функциями. Почему это так? Почему функция после yield может быть функцией flatMap, а также функции в for являются функциями map?

1 Ответ

0 голосов
/ 10 января 2019

Ваш первый пункт примерно верен. Заявление

for (x <- list) yield f(x)

эквивалентно

list.map(x => f(x))

Но вы не совсем правы относительно того, как flatMap используется, когда существует более одного списка.

Вызов flatMap используется, если вы хотите перебрать другой список одновременно:

for (
  x <- list1
  y <- list2
) yield f(x, y)

Это эквивалентно

list1.flatMap(x => list2.map(y => f(x, y)))

Вызов map заключен в вызов flatMap, поэтому в результате получается простой список. Если внешний вызов был map, то результатом был бы вложенный список.

Внутренний вызов всегда является вызовом map, все внешние вызовы flatMap. Так

for (
  x <- list1
  y <- list2
  z <- list3
) yield f(x, y, z)

Есть

list1.flatMap(x => list2.flatMap(y => list3.map(z => f(x, y, z))))

В конце концов, лучшее, что можно сделать с for, - это поэкспериментировать с ним, пока он не сделает то, что вы хотите, и через некоторое время он станет интуитивным.

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