Для понимания Будущее и Либо
Я изо всех сил пытаюсь составить последовательность асинхронных процессов хорошим монадическим способом. Каждый шаг процесса может завершиться неудачей, поэтому он получает 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
}