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

标签 scala scala-cats

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

相关文章:

scala - 为什么可以写柯里化(Currying)?

Scala 猫,笛卡尔平面 map ?

scala - 如何使用猫和 State Monad

scala - 根据从最小数字开始的范围将数字列表分组

java - Scala 枚举 ValueSet.isEmpty 慢

scala - 为什么添加同伴对象时不能使用“组合”的case类?

scala - 在 Scala 中结合 scalacheck Gen 和 Future

java - 使用 akka 流将数据分块写入文件

Scala HashMap : iterate in insertion order?

scala - 我如何解释 fold 和 foldK 之间的区别?