我正在使用monix产生副作用,并以这种类型结束
Task[Either[A, Task[B]]]
,有没有办法获得Task[Either[A, B]]
?
到目前为止,我所能做的就是将Task[Either[A, Task[B]]]
转换为Task[Any]
,基本上使用模式匹配和展平将Either
删除,但是在处理过程中丢失了类型信息
val tEitherT: Task[Either[A, Task[B]]] = ???
val finalType: Task[Any] =
tEitherT.map(either => {
either match {
case Right(value) => value // Task[B]
case Left(value) => Task(value) // Lift
}
}).flatten
答案 0 :(得分:4)
尝试一下:
tEitherT.flatMap {
case Right(taskB) => taskB.map(Right(_))
case Left(a) => Task(Left(a))
}
答案 1 :(得分:2)
import monix.eval.Task
import cats.implicits._
import cats.Traverse
trait A
trait B
def tEitherT: Task[Either[A, Task[B]]] = ???
type EitherRight[T] = Either[A,T] // or use kind-projector plugin instead
val finalType: Task[Either[A, B]] =
tEitherT.flatMap(Traverse[EitherRight].sequence(_))
在scala 2.13中或使用选项-Ypartial-unification
,您可以简化为tEitherT.flatMap(_.sequence)
。请参阅第二个答案here。