scala - 如何将 Future 的分离转换为分离的 Future

标签 scala scalaz monad-transformers scala-cats

我有一个方法的结果:val res: Future[Int] Xor Future[String] = getResult(x)
并想对其进行转换并将其用作 Future[Int Xor String]
我无法从 herding cats blog 推断我的用例并且不确定 monad 转换器是否是这里的正确工具,也许是某种形式的 traverse ?
Xor from cat 代表任何分离。 Scalaz \/或标准库 Either也可以(尽管我更喜欢有偏见的分离)。

谢谢

最佳答案

正如 sequence允许你转一个 F[G[A]]G[F[A]]F有一个 Traverse实例和 G适用,bisequence让你转一个F[G[A], G[B]]G[F[A, B]]如果 F有一个 Bitraverse实例(和 G 是适用的)。

Cats 提供了一个 Bitraverse at least a couple of versions 的实现(我在这里使用 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
Bitraverse有点像Scalaz的ZipCozip (在另一个答案中提到),但它更通用,因为可以为具有两个类型参数的任何类型构造函数定义实例(假设它具有适当的语义),而不仅仅是元组或析取。

关于scala - 如何将 Future 的分离转换为分离的 Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37327257/

相关文章:

json - 在 Spark DataFrame 中布局 TimeSeries 数据的最佳方式 - Scala

scala - 如何对 apache spark scala 中的多列数据进行排序?

scala - Option、Either 等上的折叠和 Traversable 上的折叠有什么关系?

scala - 尾递归和 scalaz promises

haskell - 从 State 切换到 StateT 后,如何恢复单子(monad)构造列表的惰性求值?

scala - 工作人员是否还需要为Spark安装Hadoop?

java - 警告 TaskSetManager : Lost Task xxx: java. lang.ArrayIndexOutOfBoundsException: 1 - Scala

functional-programming - F# 中是否有类似于 scalaz、cats 和 arrow (Kotlin) 的库?

haskell - 我怎样才能继续实现这个monad转换器?

haskell - Map.lookup 的 Maybe 结果不是使用我的 Monad Transformer 堆栈进行类型检查