如何将 Either[Future[A], Future[B]] 转换为 Future[Either[A, B]]

How to transform Either[Future[A], Future[B]] to Future[Either[A, B]]

我有一个 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 的版本

为了 reader 方便,已从评论中整理出答案:

1:您可以在普通的 scala 中完成(此处使用 cats.Functor 定义),由@wheaties 和@jean-philippe-pellet

提供
def 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 由于导入冲突而拒绝编译:此处一次导入就足够了 - @kolmar

提供
import cats.instances._
...
val futureOfEither = eitherOfFutures.bisequence

3:阅读 cats import guide 以避免将来出现此问题 - @peter-neyens

提供