scala - 如何在 List[F[G[A]]] 上运行序列以获得 F[G[List[A]]]

标签 scala scalaz

是否可以转换 List[F[G[A]]]进入 F[G[List[A]]]很好?

我可以通过以下方式在 Scalaz 中执行此操作:

val x: List[Future[Option[Int]]] = ???
val transformed: Future[Option[List[Int]]] = x.sequenceU.map(_.sequenceU)

我只是想知道是否有更好的方法来做到这一点而不是.sequenceU.map(_.sequenceU)也许使用单子(monad)变压器?我确实尝试过这个,但没有太多运气。

最佳答案

如果您想避免嵌套排序,Monad 转换器是您的最佳选择。在这种情况下,您需要 OptionT[Future, A] (相当于 Future[Option[A]] ):

import scalaz._, Scalaz._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

val xs = List(OptionT(Future(some(1))), OptionT(Future(some(2))))
val ys = OptionT(Future(none[Int])) :: xs

val sequencedXs: Future[Option[List[Int]]] = xs.sequenceU.run
val sequencedYs: Future[Option[List[Int]]] = ys.sequenceU.run

进而:
scala> sequencedXs.foreach(println)
Some(List(1, 2))

scala> sequencedYs.foreach(println)
None

正如预期的那样。

关于scala - 如何在 List[F[G[A]]] 上运行序列以获得 F[G[List[A]]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26163571/

相关文章:

scala - Scalaz 中的 State 和 Free monad 示例

scala - 如何从 Akka actor 本身中获取该 actor 的名称?

scala - sbt多模块项目: dependence between projects

scala - Scala 中的重载索引运算符

scala - 为什么 scalac 盒子是 Int?

scala - 在 Scalaz 中使用自定义半群类时遇到问题

oracle - 使用 JDBC Source 和 Redis Stream 进行 Spark Streaming

scala - 如何将函数的返回类型指定为(任意)monad?

scala - 如何从 for-comprehension 中删除折叠?

scala - 如何将 scala 案例类声明为 Scalaz 的 Semigroup 的实例?