2012-10-09 19 views

Odpowiedz

39

Twój kod można przełożyć na to:

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

Cytaty z Programming in Scala, Second Edition:

Ogólnie, do ekspresji ma postać:

for (seq) yield expr 

Tutaj , seq to sekwencja generatorów, d efinitions i filtry, z średnikami między kolejnymi elementami.

To dla ekspresji zawiera jeden generator, jedną definicję i jeden filtr:

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

Tłumaczenie dla wyrazu z jednego generatora

Pierwszy, że masz prosty dla wyrażenia:

for (x <- expr1) yield expr2 

gdzie x jest zmienną. Takie wyrażenie jest przetłumaczony na:

expr1.map(x => expr2) 

Przełożenie dla wyrażeń wyjściowych z generatora oraz filtr

Teraz rozważenia dla wyrażeń, które łączą wiodącą generator z niektórych innych elementów. A dla wyrażeniem postaci:

for (x <- expr1 if expr2) yield expr3 

są tłumaczone na:

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

Tłumaczenie dla wyrażenia zaczynające się od dwóch generatorów

Kolejna sprawa uchwyty do wyrażeń, które są uruchamiane z dwóch generatorów, w:

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

for wypowiedzi powyżej jest tłumaczony do stosowania flatMap:

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

ok, myślę, że mam to w rzeczywistości, mam ten kawałek kodu działa teraz jak mój następny kawałek def simpleProgram: Przyszłość [ Int] = { dla { wyniku <- serviceCall() } yield result } –

Powiązane problemy