1

map(identity)Scala内包表記を避けるにはどうすればよいforですか?

たとえば、次のことを考慮してください。

import scala.concurrent._
import scala.concurrent.duration._

object Test extends App {
  implicit val executorContext = ExecutionContext.global
  val future = Future.successful { 1 }
  val result = for (
    value <- future;
    b <- Future { value * 2 }
  ) yield b
  println(Await.result(result, 60 seconds))
}

IIUC、理解は次のforようなものに変換されます

future.flatMap(value => Future { value * 2 }).map(identity)

map(identity)何らかの方法で末尾を回避できますか? それとも、Scala はそれを最適化できますか? map(副作用があるかどうかは不明なので、できないと思いますよね?)

PS この特定の例では、物事を改善できることを知っています。たとえば、未来を返す関数Future { value * 2}の呼び出しである一般的なケースについて疑問に思っています。f(value)f

4

1 に答える 1

2

独自のFutureを作成して、その内部でアプリケーションを操作するのはアンチパターンです。代わりに、次のことができます。

  • future.map()そして最後にonSuccess(これは最も単純なモデルです)で結果を取得します
  • あなたが理解に完全に固執し、yield Future { value * 2 }そしてあなたの結果を得るならば...(これは偽の未来の創造の問題を解決しませんが)
  • transformあなたの未来そしてあなたの結果を得る...
  • collectあなたの将来とmap(f)結果について

コンテキストと計算モデルに応じて、これらのソリューションのいずれかがより適切な場合があります。一般的な状況の特定のケースを提示しているように見えますが、一般的な状況に先物の反復、1つの先物の変換の連鎖が含まれるべきかどうかは不明です。または完全に何か他のもの。

于 2013-01-25T15:15:54.590 に答える