9

我有一个实例,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 版本

4

1 回答 1

5

为方便读者,整理了评论中的答案:

1:你可以用普通cats.Functor的 scala 来做(这里用于定义),由@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:猫bisequence因为导入冲突而拒绝编译:这里一个导入就足够了 - 由@kolmar提供

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

3:阅读猫进口指南以避免将来出现问题 - 礼貌@peter-neyens

于 2016-12-17T06:26:35.557 回答