point/liftM सिंटैक्स का उपयोग करके \/[Error, Int] को EitherT[Future, Error, Int] में कैसे उठाएं ताकि लिफ्टिंग दाईं ओर हो?

मेरे पास निम्न परिदृश्य है:

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]

सुझाए गए यहां और यहां, हालांकि इस प्रकार

EitherT[Future, Error, Error \/ Int]

जबकि मुझे चाहिए

EitherT[Future, Error, Int]

लिफ्टिंग को दाईं ओर ले जाना केवल सौंदर्यशास्त्र के लिए है, क्योंकि EitherT.fromDisjunction[Future] ठीक काम करता है।

4
Mario Galic 24 जून 2019, 20:25

2 जवाब

सबसे बढ़िया उत्तर

यह सिर्फ

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
3
Dmytro Mitin 25 जून 2019, 09:50

मुझे यकीन नहीं है कि यह स्कैलाज़ में मौजूद है या नहीं। वियोजन पर कोई 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]

1
triggerNZ 25 जून 2019, 09:37