在for-expressions上阅读这篇优秀的answer后,我尝试将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-expression。
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(...)
,但找到了}
。
我的表达方式出了什么问题?
答案 0 :(得分:2)
您的理解需要将getId
的结果与名称绑定,yield
表示:
val xs: List[String] = for {
r <- result
x <- getId(Json.parse(r))
} yield x
for-comprehension中的每一行都需要使用
将monadic计算的结果绑定到名称x <- expr
// or, `_ <- expr` to run `expr` purely for its effects and ignore the result
或者它需要是一个简单的任务,例如
x = expr
由于getId(Json.parse(r))
单独使用,因此无效。