斯卡拉的“理解”与未来

我正在阅读Scala Cookbook( http://shop.oreilly.com/product/0636920026914.do )

有一个与未来使用相关的例子涉及到理解。

到目前为止,我对理解的理解是,当与一个集合一起使用时,它将产生具有相同types的另一个集合。 例如,如果每个futureX都是Future[Int]types,则以下也应该是Future[Int]types:

 for { r1 <- future1 r2 <- future2 r3 <- future3 } yield (r1+r2+r3) 

有人能解释一下,当在这个代码中使用<-时发生了什么? 我知道如果它是一个生成器,它会通过循环来获取每个元素。

首先关于理解。 它被很多次的回答,这是对一些单子操作的抽象: mapflatMapwithFilter 。 当你使用<- ,scalac把这个行parsing成monadic flatMap

r <- monad into monad.flatMap(r => ... )

它看起来像一个命令性的计算(monad是什么),你将计算结果绑定到ryield部分被parsing成map调用。 结果types取决于monad的types。

Future特质有flatMapmap函数,所以我们可以用它来理解。 在你的例子中可以parsing成以下代码:

 future1.flatMap(r1 => future2.flatMap(r2 => future3.map(r3 => r1 + r2 + r3) ) ) 

并行性

不言而喻,如果future2执行取决于r1那么你不能逃避顺序执行,但是如果将来的计算是独立的,你有两个select。 您可以执行顺序执行,或允许并行执行。 你不能执行后者,因为执行上下文将处理这个。

 val res = for { r1 <- computationReturningFuture1(...) r2 <- computationReturningFuture2(...) r3 <- computationReturningFuture3(...) } yield (r1+r2+r3) 

将永远运行sequentailly。 通过desugaring可以很容易地解释,之后的computationReturningFutureX ReturnFutureX调用仅在flatMaps内部调用。

 val future1 = computationReturningFuture1(...) val future2 = computationReturningFuture2(...) val future3 = computationReturningFuture3(...) val res = for { r1 <- future1 r2 <- future2 r3 <- future3 } yield (r1+r2+r3) 

能够并行运行,理解汇总结果。

如果可能,它允许r1r2r3并行运行。 这可能是不可能的,取决于有多less线程可用于执行未来的计算,但是通过使用此语法,您可以告诉编译器在可能的情况下并行运行这些计算,然后在全部完成时执行yield()