将\ / [A,B]提升到EitherT [Future,A,B]

时间:2019-06-24 17:25:31

标签: scala scalaz monad-transformers

如何使用\/[Error, Int]语法将EitherT[Future, Error, Int]提升为point/liftM,使提升在右侧?

我有以下情况

for {
  r1 <- f1: EitherT[Future, Error, Int]
  r2 <- v: \/[Error, Int]
  r3 <- f2: EitherT[Future, Error, Int]
} yield r3

我可以像这样应用EitherT.fromDisjunction[Future]使v适合

for {
  r1 <- f1
  r2 <- EitherT.fromDisjunction[Future](v)
  r3 <- f2
} yield r3

或者简单地

for {
  r1 <- f1
  r2 <- EitherT(Future(v))
  r3 <- f2
} yield r3

但是我试图像这样将提升魔法移至v的右侧

for {
  r1 <- f1
  r2 <- v.point[Future].liftM[EitherT] // something approximately like this
  r3 <- f2
} yield r3

我尝试过

type Result[F[_], A] = EitherT[F, Error, A]
v.point[Future].liftM[Result]

v.point[({ type L[x] = EitherT[Future, Error, x] })#L]

建议使用herehere,但这是

EitherT[Future, Error, Error \/ Int]

我需要

EitherT[Future, Error, Int]

将提升移到右侧只是为了美观,因为EitherT.fromDisjunction[Future]很好用。

2 个答案:

答案 0 :(得分:3)

就是

r2 <- v.eitherT[Future, Error, Int]

使用

import scalaz.{EitherT, \/}
import scalaz.std.scalaFuture._
import scalaz.syntax.eithert._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.language.higherKinds

答案 1 :(得分:1)

我不确定那在scalaz中是否存在。析取没有toEitherT[F]。但是,添加新语法很简单:

  implicit class EitherLiftSyntax[A, B](val self: A \/ B) extends AnyVal {
    def liftT[M[_]]: EitherT[M, A, B] = EitherT.fromDisjunction[M](self)
  }

只要您在范围内,就可以说v.liftT[Future]