DB レコードを表す文字列 ID のリストがあります。DB から非同期的にロードし、各レコードをリモート サーバーに非同期的にアップロードし、すべてのアップロードが完了したら、アップロードされたレコードの ID を記録します。
私は Scala 2.9.2 を使用しているので、Twitter の core-util Future 実装を使用していますが、Monadic 変換に関しては 2.10 の future とまったく同じように機能するはずです。
一般的な概念は次のとおりです。
def fetch(id: String): Future[Option[Record]]
def upload(record: Record): Future[String]
def notifyUploaded(ids: Seq[String]): Unit
val ids: Seq[String] = ....
私は理解のためにこれをやろうとしていますが、フェッチがオプションの未来を返すという事実はそれをあいまいにし、コードはコンパイルされません:
for {
id <- ids
maybeRecord <- fetch(id)
record <- maybeRecord
uploadedId <- upload(record)
} yield uploadedId
これをコンパイルすると、次のエラーが発生します。
scala: type mismatch;
found : com.twitter.util.Future[String]
required: Option[?]
uploadedId <- upload(record)
^
私は何が欠けていますか?なぜコンパイラは、uploadedId がオプションであると想定するのですか? これを回避できるかなりの方法はありますか?