如何将未来的分离转化为分离的未来

kos*_*tja 3 scala monad-transformers scalaz scala-cats

我有一个方法的结果: val res: Future[Int] Xor Future[String] = getResult(x)

并希望改造它并将其用作 Future[Int Xor String]

我无法从牧羊猫博客中推断我的用例,我不确定monad变换器是否是正确的工具,也许是某种形式的traverse

Xor来自猫的任何分离.Scalaz \/或stdlib Either也可以(虽然我更喜欢有偏见的析取).

谢谢

Tra*_*own 9

正如sequence允许您打开一个F[G[A]]G[F[A]]F有一个Traverse实例,G是应用性,bisequence可以让你把一个F[G[A], G[B]]成一个G[F[A, B]],如果F有一个Bitraverse实例(并且G是应用性).

猫提供了一个Bitraverse实现了至少几个版本(我使用0.6.0-M2在这里),所以你可以这样写:

import cats.data.Xor, cats.std.future._, cats.syntax.bitraverse._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

def flip[A, B](x: Xor[Future[A], Future[B]]): Future[Xor[A, B]] = x.bisequence
Run Code Online (Sandbox Code Playgroud)

Bitraverse有点像Scalaz的ZipCozip(在对方的回答中提到),但它在这情况下,更通用的可以有两个类型参数的任何类型的构造函数中定义(假定它有适当的语义),而不仅仅是元组或脱节.