是否可以转换 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/