6

免責事項: 以下のコード スニペットは、進行中の Coursera コースの 1 つに関連しています。学習目的でのみ投稿され、宿題の解決策として提出するために使用されるべきではないと考えてみましょう.

以下のコメントにあるように、Future のリストをリストの単一の Future に変換する必要があります。それ以上に、入力先物の少なくとも 1 つが失敗した場合、結果の Future は失敗するはずです。

次の実装に出会いましたが、完全には理解できません。

/** Given a list of futures `fs`, returns the future holding the list of values of all the futures from `fs`.
 *  The returned future is completed only once all of the futures in `fs` have been completed.
 *  The values in the list are in the same order as corresponding futures `fs`.
 *  If any of the futures `fs` fails, the resulting future also fails.
 */
def all[T](fs: List[Future[T]]): Future[List[T]] = 
             fs.foldRight(Future(Nil:List[T]))((f, fs2) =>
  for {
    x <- f
    xs <- fs2
  } yield (x::xs))

特に、次のことがわかりません。

  1. 変容はどこでFuture[T] -> T起こる?xs <- fs2それは私たちが最初に触れる唯一の場所のように見えFutures、各xsタイプはそうあるべきですFuture[T](しかし、どういうわけかそれはただになりますT)。
  2. 障害はどのように処理されますか? Future入力の 1 つが失敗すると、結果のオブジェクトが失敗するように見えFuturesます。
4

2 に答える 2

6

1) f が aFuture[T]であると言って、次のように書きます。

for {
 t <- f
}  yield List(t)

Future f の結果を t に格納します - したがって、t は T 型です。したがって、for-comprehension は、 から T を抽出Futuresし、それらを使って何かを行い、それらを Future に戻す場所です (OK、ここで少し単純化しています)。

と同等です

f.map(t => List(t))

2) Future f に Failure が含まれている場合、for 内包表記は、yield を実行する代わりに、この失敗した Future を返すだけです。

一般的な注意として、Scala の for-comprehension は、 で書き換えることができる単なるシュガーですmap, flatMap, filter, foreach

于 2013-12-01T01:27:38.433 に答える
2

私は英語を話す右利きなので、通常は左折しますが、折る各ステップは次のようになります。

Fn flatMap ((x: T) => Fs map (xs => x :: xs))

あなたの価値はxです。

この関数は成功時に適用されます。これは、失敗すると冷静になる理由を説明しています。

scala> timed(Await.ready(all(List(Future{Thread sleep 5*1000; 1},Future(2),Future{Thread sleep 10*1000; 3})), Duration.Inf))
res0: (Long, scala.concurrent.Awaitable[List[Int]]) = (10002419021,scala.concurrent.impl.Promise$DefaultPromise@2a8025a0)

scala> timed(Await.ready(all(List(Future{Thread sleep 5*1000; 1},Future(???),Future{Thread sleep 10*1000; 3})), Duration.Inf))
res1: (Long, scala.concurrent.Awaitable[List[Int]]) = (5000880298,scala.concurrent.impl.Promise$DefaultPromise@3750d517)

失敗したバージョンがショートすることに注意してください。

両方の情報については、flatMap の ScalaDoc を参照してください。

編集:Coursera の作業であるため慎重に話していましたが、より明確に言えば、この要件が満たされていませんfs

于 2013-12-01T02:38:54.030 に答える