scala monads for-comprehension

¿Cómo convertir este mapa/mapa plano en una comprensión en Scala?



monads for-comprehension (1)

Su código puede traducirse a esto:

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

Citas de Programación en Scala, Segunda Edición :

Generalmente, una expresión for es de la forma:

for ( seq ) yield expr

Aquí, seq es una secuencia de generadores, definiciones y filtros, con punto y coma entre elementos sucesivos.

Esta expresión contiene un generador, una definición y un filtro:

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

Traducción de expresiones con un generador.

Primero, asume que tienes una expresión simple:

for (x <- expr1) yield expr2

donde x es una variable Tal expresión se traduce a:

expr1.map(x => expr2)

Traducción de expresiones que comienzan con un generador y un filtro.

Ahora, considere las expresiones que combinan un generador líder con algunos otros elementos. A para la expresión de la forma:

for (x <- expr1 if expr2) yield expr3

se traduce a

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

Traducción de expresiones que comienzan con dos generadores.

El siguiente caso se maneja para expresiones que comienzan con dos generadores, como en:

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

La expresión for anterior se traduce a una aplicación de flatMap:

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

Cómo convertir este mapa / mapa en una para comprensión, y por favor explique cómo funciona, gracias.

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