【问题标题】:Flattening Future[EitherT[Future, A, B]]扁平化未来[EitherT[Future, A, B]]
【发布时间】:2017-01-01 18:04:13
【问题描述】:

如标题所述。

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

提前谢谢你。

【问题讨论】:

    标签: scala scalaz


    【解决方案1】:

    在所有情况下,您都可以使用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]

      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

      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) 
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 2013-07-02
      • 2018-02-17
      • 1970-01-01
      相关资源
      最近更新 更多