扁平化未来[EitherT [Future,A,B]]

时间:2017-01-01 18:04:14

标签: scala scalaz

正如标题所述。

使用EitherT[Future, A, B]完成了许多操作。有时我想通过另一个具有签名A => Future[C]的操作向左或向右移动地图。其他情况是EitherT[Future, A, B]未来导致Future[EitherT[Future, A, B]]的映射结果。

我如何优雅地压扁类型:

EitherT[Future, Future[A], Future[B]]Future[EitherT[Future, A, B]]

提前谢谢。

1 个答案:

答案 0 :(得分:2)

在所有情况下,您可以使用EitherT#flatMap(或EitherT#flatMapF),并将EitherT(或析取(\/)的某些值与{{1 }})。

  • flatMapF映射到B => F[C]

    EitherT[F, A, B] +解除

    flatMap
  • import scala.concurrent.Future import scala.concurrent.ExecutionContext.Implicits.global import scalaz._, Scalaz._ def f(i: Int): Future[Double] = Future.successful(i.toDouble) val r = EitherT.right[Future, String, Int](Future.successful(1)) r.flatMap(i => EitherT.right(f(i))) // or r.flatMapF(i => f(i).map(_.right)) 映射到A => F[C]

    EitherT[F, A, B] + swap +解除

    flatMap
  • def g(s: String): Future[Int] = Future.successful(s.length) val l = EitherT.left[Future, String, Int](Future.successful("error")) l.swap.flatMap(s => EitherT.right(g(s))).swap // or l.swap.flatMap(s => EitherT.left[Future, Int, Int](g(s))) // or l.swap.flatMapF(s => g(s).map(_.left)) 映射到A => Either[F, B, C]

    举起+ F[A]

    flatMap