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

Как преобразовать эту карту/плоскую карту в понимание для Scala?

Как преобразовать эту карту /flatMap в понимание, и, пожалуйста, объясните, как это работает, спасибо.

    def compute2(maybeFoo: Option[Foo]): Option[Int] =
      maybeFoo.flatMap { foo =>
      foo.bar.flatMap { bar =>
          bar.baz.map { baz =>
          baz.compute
      }
    }
  }  
4b9b3361

Ответ 1

Ваш код можно перевести следующим образом:

def compute2(maybeFoo: Option[Foo]): Option[Int] =
  for {
    foo <- maybeFoo
    bar <- foo.bar
    baz <- bar.baz
  } yield baz.compute

Цитаты из Программирование в Scala, втором издании:

Как правило, выражение a для выражения имеет вид:

for ( seq ) yield expr

Здесь seq представляет собой последовательность генераторов, определений и фильтров с полуколониями между последовательными элементами.

Это выражение содержит один генератор, одно определение и один фильтр:

for {
p <- persons // a generator
n = p.name // a definition
if (n startsWith "To") // a filter
} yield n

Перевод выражений с одним генератором

Сначала предположим, что у вас есть простое выражение:

for (x <- expr1) yield expr2

где x - переменная. Такое выражение преобразуется в:

expr1.map(x => expr2)

Перевод выражений, начинающихся с генератора и фильтра

Теперь рассмотрим выражения, объединяющие ведущий генератор с некоторыми другие элементы. A для выражения вида:

for (x <- expr1 if expr2) yield expr3

переводится на:

expr1 withFilter (x => expr2) map (x => expr3)

Перевод выражений, начинающихся с двух генераторов

Следующий случай обрабатывает выражения, начинающиеся с двух генераторов, как в:

for (x <- expr1; y <- expr2) yield expr3

Вышеприведенное выражение переводится в приложение flatMap:

expr1.flatMap(x => for (y <- expr2) yield expr3)