Scala 扁平化未来[EitherT[Future,A,B]]
正如标题所提到的 使用Scala 扁平化未来[EitherT[Future,A,B]],scala,scalaz,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] 提前谢谢。在所有情况下,您都可以使用EitherT#flatMap(或Eit
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]
提前谢谢。在所有情况下,您都可以使用
EitherT#flatMap
(或EitherT#flatMapF
),并将一些值提升到EitherT
(或与flatMapF
的析取(\//code>)
- 将a
B=>F[C]
映射到aEitherT[F,a,B]
:
flatMap
+lift
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))
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=>F[C]
映射到aEitherT[F,a,B]
:
swap
+flatMap
+lift
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))
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=>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)