flatMap与表达式

时间:2013-10-16 16:29:14

标签: scala map

在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(...),但找到了}

我的表达方式出了什么问题?

1 个答案:

答案 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))单独使用,因此无效。