gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:20:43 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com