2012-10-09 42 views

回答

39

您的代码可以被转换成这样:

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

行情从Programming in Scala, Second Edition

通常,用于表达的形式为:

for (seq) yield expr 

这里,seq是一系列发生器,d定义和过滤器,在连续元素之间使用分号。

这对表达式包含一台发电机,一个定义,一个过滤器:

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) 

翻译启动与发电机和滤波器

现在表达式,考虑为结合了一些 其它元素的领先发生器表达式。形式的,一种用于表达:

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) 
+0

好吧,我想我明白了,事实上,我得到了一段代码作为我的下一块高清simpleProgram工作现在还有:未来[ Int] = { 针对{ 结果<-serviceCall() }产生结果 } –

相关问题