¿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
}
}
}