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

Kar*_*arl 3 scala scala-cats

我喜欢对效果集合进行排序,例如将 a 变成List[IO[Int]]a ,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)
Run Code Online (Sandbox Code Playgroud)

但有可能走另一条路吗?例如将 aIO[List[Int]]变成List[IO[Int]]?

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

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

谢谢。

tri*_*rNZ 5

不,这是不允许的。

IO 的整体思想是,如果没有 IO,你就无法从中获取值unsafeRunSync。不存在“窥视内部”的情况

由于 Traversable 也意味着可折叠,让我们看看为什么像foldLefton IO 这样的东西打破了内部查找规则。

def foldLeft[A, B](fa: IO[A], b: B)(f: (B, A) => B): B
Run Code Online (Sandbox Code Playgroud)

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

FoldLeft(x, 0)(_ + _),必须返回一个2. 所以我们窥探了里面。foldLeft必须unsafeRunSync,这会破坏引用透明度。

因此,出于这个(和其他类似)原因,您不能拥有Traverseon IO.