Преобразование из Задачи [Либо [A, Задача [B]]] в Задачу [Либо [A, B]] - PullRequest
1 голос
/ 27 июня 2019

Я использую 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 ]

4 голосов
/ 27 июня 2019

Попробуйте:

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

Попробуйте!

2 голосов
/ 27 июня 2019
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). Смотри второй ответ здесь .

...