为什么列表的foldRight返回未来而不是新列表?

时间:2014-09-21 09:30:46

标签: scala promise future

给定此代码将List [Future [T]]转换为Future [List [T]]

def all[T](fs: List[Future[T]]): Future[List[T]] = {

  val p = Promise[List[T]]() //create an empty promise which will contain the result (i.e. the future)
  p.success(Nil) //initialise: the result of the promise is a Future of an empty list
  fs.foldRight(p.future) { //accumulator is the future of the promise
    (oneFutueFromTheList, accFutureOfAList) =>
      for (
        actualValueOfFuture <- oneFutueFromTheList; //unpack the item in the future
        theList <- accFutureOfAList //unpack the list from the future
      ) yield actualValueOfFuture :: theList //append the item to the list
  }

}

理解的产量是List [T]。

为什么foldRight会返回Future [List [T]](而不是List [T])?是因为foldRight的累加器是Future [List [T]]而且foldRight是&#34;聪明的&#34;足以知道将产量的结果List [T]放入Future [List [T]]?

代码来源:https://class.coursera.org/reactive-001反应式编程原理

2 个答案:

答案 0 :(得分:4)

for comprehension只是flatMaps和map的合成糖,所以这个循环实际上是:

oneFutueFromTheList.flatMap(actualValueOfFuture =>
  accFutureOfAList.map(theList =>
    actualValueOfFuture :: theList))

foldRight的签名是:foldRight[B](z: B)(op: (A, B) => B): B
foldRight将z作为初始值,并为每个项运行op函数。 op函数应返回Z类型的值,在本例中为List [T]。现在再次运行op函数,这次Z是最后一个op返回值。对于集合中的所有项目,这将继续 foldRight的返回值是从op函数返回的最后一个Z.

答案 1 :(得分:2)

因为p.futureFuture[List[T]]foldRight的签名是foldRight[B](z: B)(op: (A, B) ⇒ B): B

在这种情况下,zp.future,因此BFuture[List[T]]