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(IO7684131, IO21068036)
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
,您将无法从中获取值。没有"peeking inside"
因为 Traversable 也意味着 Foldable,让我们看看为什么像 foldLeft
这样的东西在 IO 上打破了 looking inside 规则。
def foldLeft[A, B](fa: IO[A], b: B)(f: (B, A) => B): B
例如,如果我们有一个 x: IO[Int]
(产生 2
)
foldLeft(x, 0)(_ + _),那将不得不 return 我们 2
。所以我们偷看了里面。 foldLeft
必须 unsafeRunSync
,这会破坏引用透明性。
因此,出于这个(和其他类似)原因,您不能在 IO
上设置 Traverse
。
我喜欢对效果集合进行排序,例如将 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(IO7684131, IO21068036)
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
,您将无法从中获取值。没有"peeking inside"
因为 Traversable 也意味着 Foldable,让我们看看为什么像 foldLeft
这样的东西在 IO 上打破了 looking inside 规则。
def foldLeft[A, B](fa: IO[A], b: B)(f: (B, A) => B): B
例如,如果我们有一个 x: IO[Int]
(产生 2
)
foldLeft(x, 0)(_ + _),那将不得不 return 我们 2
。所以我们偷看了里面。 foldLeft
必须 unsafeRunSync
,这会破坏引用透明性。
因此,出于这个(和其他类似)原因,您不能在 IO
上设置 Traverse
。