我喜欢对效果集合进行排序,例如将 a 变成List[IO[Int]]a ,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)
Run Code Online (Sandbox Code Playgroud)
但有可能走另一条路吗?例如将 aIO[List[Int]]变成List[IO[Int]]?
我似乎无法找到要添加sequence到 IO 上的隐含内容,所以现在我想知道是否无法遍历或序列 IO?
有没有人这样做过或知道为什么不允许这样做?
谢谢。
不,这是不允许的。
IO 的整体思想是,如果没有 IO,你就无法从中获取值unsafeRunSync。不存在“窥视内部”的情况
由于 Traversable 也意味着可折叠,让我们看看为什么像foldLefton IO 这样的东西打破了内部查找规则。
def foldLeft[A, B](fa: IO[A], b: B)(f: (B, A) => B): B
Run Code Online (Sandbox Code Playgroud)
例如,如果我们有一个x: IO[Int](产生2)
FoldLeft(x, 0)(_ + _),必须返回一个2. 所以我们窥探了里面。foldLeft必须unsafeRunSync,这会破坏引用透明度。
因此,出于这个(和其他类似)原因,您不能拥有Traverseon IO.
| 归档时间: |
|
| 查看次数: |
2455 次 |
| 最近记录: |