Поднимите \ / [A, B] в EitherT [Будущее, A, B] - PullRequest
4 голосов
/ 24 июня 2019

Как поднять \/[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

Iможно сделать v подгонку, применив EitherT.fromDisjunction[Future] примерно так

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]

предложил здесь и здесь , однако это тип

EitherT[Future, Error, Error \/ Int]

, в то время как мне требуется

EitherT[Future, Error, Int]

Перемещение подъема вправо - только для эстетики, как EitherT.fromDisjunction[Future] отлично работает.

Ответы [ 2 ]

3 голосов
/ 25 июня 2019

Это просто

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 голос
/ 25 июня 2019

Я не уверен, существует ли это в скалазе. На дизъюнкции нет 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]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...