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