2017-01-01 47 views
1

正如標題所述。扁平化未來[EitherT [未來,A,B]]

使用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]]

預先感謝您。

回答

2

在所有的情況下,你可以使用EitherT#flatMap(或EitherT#flatMapF),結合提升一定的參考價值EitherT(或析取(\/)與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]

    swapflatMap + +解除

    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

    def h(i: Int): EitherT[Future, String, Int] = 
        EitherT.right(Future.successful(i + 1)) 
    
    val fut = Future.successful(1) 
    
    // mapping gives us Future[EitherT[Future, String, Int]] 
    fut.map(h)      
    
    // lifting to EitherT and flatMap gives us EitherT[Future, String, Int] 
    EitherT.right(fut).flatMap(h)