繁体   English   中英

是否可以对cats.effect.IO进行排序,即是否在Traverse类型类中排序?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM