正如标题所述。
使用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]]
提前谢谢。
答案 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