gpt4 book ai didi

scala - cats.effect.IO 可以排序吗,即它在 Traverse 类型类中吗?

转载 作者:行者123 更新时间:2023-12-05 02:16:12 26 4
gpt4 key购买 nike

我喜欢对效果集合进行排序,例如将 List[IO[Int]] 变成 IO[List[Int]],就像这样:-

scala> import cats._, cats.data._, cats.implicits._, cats.effect._

scala> val efs : List[IO[Int]] = List(IO(1),IO(2))
efs: List[cats.effect.IO[Int]] = List(IO$647684131, IO$2021068036)

scala> var efOfInts = efs.sequence
efOfInts: cats.effect.IO[List[Int]] = <function1>

scala> efOfInts.unsafeRunSync
res2: List[Int] = List(1, 2)

但有可能走另一条路吗?例如,将 IO[List[Int]] 转换为 List[IO[Int]]

我似乎无法找到将 sequence 添加到 IO 上的隐式,所以现在我想知道是否无法遍历或序列 IO?

有没有人这样做过或知道为什么不允许这样做?

谢谢。

最佳答案

不,这是不允许的。

IO 的整体思想是,如果没有 unsafeRunSync,您将无法从中获取值。没有“内窥镜”

由于 Traversable 也意味着 Foldable,让我们看看为什么 IO 上的 foldLeft 打破了向内看的规则。

def foldLeft[A, B](fa: IO[A], b: B)(f: (B, A) => B): B

例如,如果我们有一个 x: IO[Int](产生 2)

foldLeft(x, 0)(_ + _),它必须返回一个 2。所以我们偷看了里面。 foldLeft 必须 unsafeRunSync,这会破坏引用透明性。

因此,由于这个(以及其他类似的)原因,您不能在 IO 上使用 Traverse

关于scala - cats.effect.IO 可以排序吗,即它在 Traverse 类型类中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50500897/

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