[英]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(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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.