私はDBレコードを表す文字列IDのリストを持っています。 DBから非同期的にロードしたいのですが、各レコードをリモートサーバに非同期でアップロードし、すべてのアップロードが完了したら、アップロードされたレコードのIDを記録します。スカラでの理解のためのTraversableOnce、Future、Option
私はScala 2.9.2を使っていますので、私はTwitterのcore-util Future実装を使用していますが、Monadic変換の点で2.10の先物とまったく同じように動作するはずです。
一般的な概念はこれです:私は理解が、オプションの将来は、それがあいまいになり、コードがコンパイルされないリターンをフェッチ事実を介して、これをやろうとしている
def fetch(id: String): Future[Option[Record]]
def upload(record: Record): Future[String]
def notifyUploaded(ids: Seq[String]): Unit
val ids: Seq[String] = ....
:
私はマイルだ何scala: type mismatch;
found : com.twitter.util.Future[String]
required: Option[?]
uploadedId <- upload(record)
^
:次のエラーになり、これをコンパイルする
for {
id <- ids
maybeRecord <- fetch(id)
record <- maybeRecord
uploadedId <- upload(record)
} yield uploadedId
ssing?なぜコンパイラはuploadedIdをOptionと期待していますか?私はこれを回避できる方法はありますか?
[理解のためのScalaで型の不一致](http://stackoverflow.com/questions/4719592/type-mismatch-on-scala-for-comprehension) –
の可能重複モナドはモノイドであります** Endo **のカテゴリ - ファンクタ。 Just sayin ' – folone
@folone:私は誰もが[冗談]を取得する恐れがあります(http://stackoverflow.com/questions/3870088/a-monad-is-just-a-monoid-in-the-category-of -endofunctors-whats-the-problem)を実行します。 Just sayin ' –