将 EitherT[Future, A, Future[B]] 转换为 EitherT[Future, A, B]
Convert EitherT[Future, A, Future[B]] to EitherT[Future, A, B]
我正在尝试将 EitherT[Future, A, B]
更改为 EitherT[Future, C, D]
,为此,我正在使用 bimap
来适当地映射左右部分。
当我正在转换这个 EitherT
的正确部分时,我正在进行一个服务调用 returns 我是 Future[D]
…我在将这个 Future[D]
转换为 [=17] 时遇到了问题=] 在我的 bimap
中。不确定现在如何进行。如有任何帮助,我们将不胜感激。
伪代码:
val myResult: EitherT[Future, C, D] = EitherT[Future, A, B](myService.doStuff())
.bimap({ err => /*deal with errors and give me C*/ }
,{ success => someService.doSomething(success) // This is returing a Future[D]. But I want a D
})
尝试.flatMap
又名for
-理解
import cats.data.EitherT
import cats.instances.future._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
val myResult: EitherT[Future, C, D] = for {
d <- EitherT.right(someService.doSomething())
res <- EitherT[Future, A, B](myService.doStuff())
.bimap({ err => ??? : C //deal with errors and give me C
}, { success => {
d
}
})
} yield res
尝试.biSemiflatMap
val myResult: EitherT[Future, C, D] =
EitherT[Future, A, B](myService.doStuff())
.biSemiflatMap({ err => Future.successful(??? : C)
}, { success => {
someService.doSomething(success)
}
})
我正在尝试将 EitherT[Future, A, B]
更改为 EitherT[Future, C, D]
,为此,我正在使用 bimap
来适当地映射左右部分。
当我正在转换这个 EitherT
的正确部分时,我正在进行一个服务调用 returns 我是 Future[D]
…我在将这个 Future[D]
转换为 [=17] 时遇到了问题=] 在我的 bimap
中。不确定现在如何进行。如有任何帮助,我们将不胜感激。
伪代码:
val myResult: EitherT[Future, C, D] = EitherT[Future, A, B](myService.doStuff())
.bimap({ err => /*deal with errors and give me C*/ }
,{ success => someService.doSomething(success) // This is returing a Future[D]. But I want a D
})
尝试.flatMap
又名for
-理解
import cats.data.EitherT
import cats.instances.future._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
val myResult: EitherT[Future, C, D] = for {
d <- EitherT.right(someService.doSomething())
res <- EitherT[Future, A, B](myService.doStuff())
.bimap({ err => ??? : C //deal with errors and give me C
}, { success => {
d
}
})
} yield res
尝试.biSemiflatMap
val myResult: EitherT[Future, C, D] =
EitherT[Future, A, B](myService.doStuff())
.biSemiflatMap({ err => Future.successful(??? : C)
}, { success => {
someService.doSomething(success)
}
})