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

Can cats.effect.IO be sequenced, ie is it in the Traverse typeclass?

我喜欢对效果集合进行排序,例如将 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(IO7684131, IO21068036)

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,您将无法从中获取值。没有"peeking inside"

因为 Traversable 也意味着 Foldable,让我们看看为什么像 foldLeft 这样的东西在 IO 上打破了 looking inside 规则。

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

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

foldLeft(x, 0)(_ + _),那将不得不 return 我们 2。所以我们偷看了里面。 foldLeft 必须 unsafeRunSync,这会破坏引用透明性。

因此,出于这个(和其他类似)原因,您不能在 IO 上设置 Traverse