读完这篇优秀文章后answer在 for 表达式上,我尝试转换我的 flatMap
到 for-expression
.
val results: List[String] = foo()
def getId: List[String] = List((json \ "_id").asOpt[String].getOrElse(""))
val xs: List[String] = results.flatMap( x => getId(Json.parse(x)))
然后是 for 表达式。
val results: List[String] = foo()
def getId: List[String] = List((json \ "_id").asOpt[String].getOrElse(""))
val xs: List[String] = for {
r <- result
getId(Json.parse(r))
}
我收到一个编译时错误 <-
预计在 getId(...)
线,但发现}
.
我的 for 表达式有什么问题?
最佳答案
您的 for 理解需要将 getId
的结果绑定(bind)到名称,并yield
:
val xs: List[String] = for {
r <- result
x <- getId(Json.parse(r))
} yield x
for-compression 中的每一行都需要使用以下方法将单子(monad)计算的结果绑定(bind)到名称
x <- expr
// or, `_ <- expr` to run `expr` purely for its effects and ignore the result
或者它需要是一个简单的分配,例如
x = expr
由于 getId(Json.parse(r))
单独两者都不会,因此这是无效的。
关于scala - flatMap 与 for 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19408769/