for-expression to flatMap Conversion

时间:2013-11-27 02:51:38

标签: scala

以下for-expression对我来说似乎很直观。获取List(1)中的每个项目,然后映射List("a"),然后返回List[(Int, String)]

scala> val x = for {
     | a <- List(1)
     | b <- List("a")
     | } yield (a,b)
x: List[(Int, String)] = List((1,a))

现在,将其转换为flatMap,我似乎不太清楚。如果我理解正确,我需要先调用flatMap,因为我正在使用最初的List(1),然后应用一个函数来转换A => List[B]

scala> List(1).flatMap(a => List("a").map(b => (a,b) ))
res0: List[(Int, String)] = List((1,a))

使用flatMap后,似乎需要使用map,因为我需要从A => B开始。

但是,随着for-expression(例如2到3个项目)中的项目数量增加,我如何知道在转换自{map时使用flatMapfor-expression 1}}到flatMap

1 个答案:

答案 0 :(得分:8)

在使用for comprehension时,您始终flatMap,直到您提取的最后一个值为map。所以如果你有三个项目:

  for {
    a <- List("a")
    b <- List("b")
    c <- List("c")
  } yield (a, b, c)

它将与:

相同
  List("a").flatMap(a => List("b").flatMap(b => List("c").map(c => (a, b, c))))

如果您查看flatMap的签名A => M[B]。因此,当我们为了理解添加元素时,我们需要flatMap它们,因为我们继续将M[B]添加到理解中。当我们到达最后一个元素时,没有什么可以添加的,所以我们使用map,因为我们只想从A => B开始。希望这是有道理的,如果没有带你,你应该在Coursera上观看Reactive Programming课程中的一些视频,因为他们会对此进行过多次讨论。