我喜欢对效果集合进行排序,例如将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的隐含所以现在我想知道Traverse或Sequence IO是否不可能?
有没有人这样做或知道为什么不允许这样做?
感谢。
答案 0 :(得分:0)
不,不允许。
IO的整个想法是,如果没有unsafeRunSync
,你就无法获得价值。内部没有&#34;偷看&#34;
由于Traversable也意味着可折叠,所以让我们看看为什么像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
,这会破坏参照透明度。
因此,出于这个(以及其他类似的)原因,您无法在Traverse
上IO
。