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

时间:2018-05-24 04:18:51

标签: 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的隐含所以现在我想知道Traverse或Sequence IO是否不可能?

有没有人这样做或知道为什么不允许这样做?

感谢。

1 个答案:

答案 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,这会破坏参照透明度。

因此,出于这个(以及其他类似的)原因,您无法在TraverseIO