Future[Option[Future
val fof = Future[Option[Future[Int]]] val fo1 = fof.flatMap({ case None => Future.successful(None) case Some(a) => a.map(Some(_)) }) val fo2 = fof.flatMap(opt => Future.sequence(opt.toSeq).map(_.headOption)) // Option拡張されんやつ fof.flatMap(Future.sequence) // TraversableOnce:[http://eed3si9n.github.io/scala-collections-doc-ja/collections_43.html] //scalaz execution context import scalaz.std.option._ import scalaz.std.scalaFuture._ import scalaz.syntax.traverse._ val fo3 = fof.flatMap(_.sequence)
とってもきれい
シグネチャ
/** Traverse with the identity function */ final def sequence[G[_], B](implicit ev: A === G[B], G: Applicative[G]): G[F[B]] = { val fgb: F[G[B]] = ev.subst[F](self) F.sequence(fgb) }
FutureがApplicativeで、OptionがTraverseで
この場合の型パラメータは Future[Int] === G_[B_]
val fgb: Option[Future[Int]] = ev.subst[F](self)
F.sequence(fgb)
もっとふかくみるとおそらく Leibniz
をみなきゃだから、いったんここでやめておく