Phi*_*hil 18 monads scala for-comprehension
如何将此地图/ flatMap转换为for comprehension,请解释它是如何工作的,谢谢.
def compute2(maybeFoo: Option[Foo]): Option[Int] =
maybeFoo.flatMap { foo =>
foo.bar.flatMap { bar =>
bar.baz.map { baz =>
baz.compute
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ser*_*nko 40
您的代码可以翻译成:
def compute2(maybeFoo: Option[Foo]): Option[Int] =
for {
foo <- maybeFoo
bar <- foo.bar
baz <- bar.baz
} yield baz.compute
Run Code Online (Sandbox Code Playgroud)
通常,for表达式的形式如下:
for ( seq ) yield expr
Run Code Online (Sandbox Code Playgroud)
这里,seq是一系列生成器,定义和过滤器,在连续元素之间具有分号.
这个表达式包含一个生成器,一个定义和一个过滤器:
for {
p <- persons // a generator
n = p.name // a definition
if (n startsWith "To") // a filter
} yield n
Run Code Online (Sandbox Code Playgroud)
使用一个生成器翻译表达式
首先,假设您有一个简单的表达式:
for (x <- expr1) yield expr2
Run Code Online (Sandbox Code Playgroud)
其中x是变量.这样的表达被翻译成:
expr1.map(x => expr2)
Run Code Online (Sandbox Code Playgroud)
翻译以生成器和过滤器开头的表达式
现在,考虑将前导生成器与其他元素组合在一起的表达式.A表达形式:
for (x <- expr1 if expr2) yield expr3
Run Code Online (Sandbox Code Playgroud)
被翻译成:
expr1 withFilter (x => expr2) map (x => expr3)
Run Code Online (Sandbox Code Playgroud)
翻译以两个生成器开头的表达式
下一个案例处理以两个生成器开头的表达式,如:
for (x <- expr1; y <- expr2) yield expr3
Run Code Online (Sandbox Code Playgroud)
上面的for表达式被转换为flatMap的应用程序:
expr1.flatMap(x => for (y <- expr2) yield expr3)
Run Code Online (Sandbox Code Playgroud)