Как преобразовать либо [будущее[а], будущее[Б]] в будущее[либо[А, Б]]
У меня есть экземпляр Either[Future[A], Future[B]]
, и я хотел бы преобразовать его в Future[Either[A, B]]
.
Поскольку мой предыдущий вопрос, cats 0.8.1 был выпущен, изменив структуру библиотеки и отбросив Xor
в пользу Either
, который является правым смещением в 2.12.
cats.instances.either._
cats.implicits._
cats.syntax.bitraverse._
Выглядело правдоподобно, но, к сожалению, не работает. Компиляция все еще терпит неудачу с value bisequence is not a member of Either[scala.concurrent.Future[A],scala.concurrent.Future[B]]
Расширение импорта до *.all._
не изменило ошибку компилятора.
Я на scala 2.11.8, так как не все библиотеки, от которых зависит проект, выпустили версию для 2.12
1 ответ:
Собрали ответы из комментариев для удобства читателя:
1: Вы можете сделать это в простой scala (используя
cats.Functor
для определения здесь), любезно предоставленный @wheaties & @jean-philippe-pelletdef eitherFmap[F[_], A, B](either: Either[F[A], F[B])(implicit F: Functor[F]): F[Either[A, B]] = either.fold(f => F.map(f)(Left(_)), f => F.map(f)(Right(_)))
2: cats
bisequence
отказался компилироваться из-за конфликтующих импортеров: здесь достаточно одного импорта-любезно предоставлено @kolmarimport cats.instances._ ... val futureOfEither = eitherOfFutures.bisequence
3: прочитайте руководство по импорту кошек , чтобы избежать этой проблемы в будущем-любезность @peter-neyens