从Task [Either [A,Task [B]]]转换为Task [Either [A,B]]

时间:2019-06-27 02:12:48

标签: scala scala-cats side-effects monix

我正在使用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

2 个答案:

答案 0 :(得分:4)

尝试一下:

tEitherT.flatMap {
  case Right(taskB) => taskB.map(Right(_))
  case Left(a) => Task(Left(a))
}

Try it out!

答案 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