Ответ 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)