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也可以(虽然我更喜欢有偏见的析取).
谢谢
正如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的Zip或Cozip(在对方的回答中提到),但它在这情况下,更通用的可以有两个类型参数的任何类型的构造函数中定义(假定它有适当的语义),而不仅仅是元组或脱节.