2017-01-01 6 views
1

タイトルに言及します。フラット化の未来[どちらかT [未来、A、B]]

EitherT[Future, A, B]を使用して多くの操作を行っています。時々、私は、署名を持つ別の操作を左または右にマップしたいと考えています。A => Future[C]。他のシナリオでは、という未来のマッピング結果がEitherT[Future, A, B]です。

どのように私はエレガントなようなタイプのフラット化することができます

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

は、事前にありがとうございます。すべてのケースで

答えて

2

あなたはEitherTflatMapFを持つか、論理和(\/))に何らかの値を持ち上げると組み合わせて、EitherT#flatMap(またはEitherT#flatMapF)を使用することができます。

B => F[C] EitherT[F, A, B]にわたってマッピング
  • swap + flatMap +

    を持ち上げる:

    flatMap +はEitherT[F, A, B]A => F[C]マッピング

    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)) 
    
  • を持ち上げます3210

    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)