EitherT в Scala не работает с For Computing

У меня есть такой код:

 (for {
      oldResult <- EitherT[Future, A, B](getById(id))
      newResult <- EitherT.right(update(changeOldData(oldResult)))
    } yield newResult).value

Где функции возвращаются

 getById       -> Future[Either[A, B]]
 update        -> Future[B]
 changeOldData -> B

Предполагается, что весь блок вернется:

Future[Either[A, B]]

В IntelliJ нет претензий к приведенному выше коду, но при компиляции я получаю следующую ошибку:

[error]  found   : B => cats.data.EitherT[scala.concurrent.Future,Nothing,B]
[error]  required: B => cats.data.EitherT[scala.concurrent.Future,A,B]
[error]           oldResult <- EitherT[Future, A, B](

Я попытался не указывать тип, но тоже получаю ту же ошибку. Есть идеи, почему?


person joao.sauer    schedule 29.01.2020    source источник
comment
Важно отметить, что компилятор представлений IntelliJ для Scala не имеет полной функциональности. Так что никогда не полагайтесь на int.   -  person Markus Appel    schedule 29.01.2020


Ответы (1)


Когда вы вызываете EitherT.right(..), компилятор не может определить, какой у вас левый тип. Вот почему в сообщении об ошибке говорится, что он обнаружил Nothing вместо A. Вам нужно немного помочь.

EitherT.right[A](update(changeOldData(oldResult)))

Это будет компилироваться.

person Saskia    schedule 29.01.2020
comment
Спасибо, проблема устранилась. Самое смешное, что ошибка связана с первой частью For, а не со второй. - person joao.sauer; 29.01.2020