如何将 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
提供
我有一个 Either[Future[A], Future[B]]
的实例,我想将其转换为 Future[Either[A, B]]
。
自从 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
提供