Для понимания Будущее и Либо

Я изо всех сил пытаюсь составить последовательность асинхронных процессов хорошим монадическим способом. Каждый шаг процесса может завершиться неудачей, поэтому он получает Future[Either[String, T]],

def firstStep(input: Int): Future[Either[String, Long]] = ???
def secondStep(input: Long): Future[Either[String, String]] = ???
def thirdStep(input: String): Future[Either[String, Double]] = ???

Учитывая эти функции, я хотел бы составить их так

def process(input: Int): Future[Either[String Double]] = {
     for{
        res1 <- firstStep(input)
        res2 <- secondStep(res1)
        res3 <- thirdStep(res2)
     } yield res3
}

Но это не работает, потому что каждый частичный результат Either[String, T]и что мне нужно, это T сам (или просто остановить выполнение и вернуть Left если это так).

Как я могу составить эту функцию хорошим монадическим способом (используя для-понимания)?

1 ответ

Решение

EitherT может помочь монадный трансформер (каламбур) от кошек или скалаза:

import cats._
import cats.implicits._
import cats.EitherT

def process(input: Int): Future[Either[String, Double]] = {
   val res = for {
      res1 <- EitherT(firstStep(input))
      res2 <- EitherT(secondStep(res1))
      res3 <- EitherT(thirdStep(res2))
   } yield res3
   res.value
}
Другие вопросы по тегам