代码之家  ›  专栏  ›  技术社区  ›  Karl

cats.effect.io是否可以排序(是否在遍历类型类中)?

  •  1
  • Karl  · 技术社区  · 6 年前

    我喜欢按顺序收集效果(如 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[列表[int] 列表[io[int] ?

    我似乎找不到要补充的含义 sequence 关于IO,现在我想知道是否不可能遍历或排序IO?

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

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Yuval Itzchakov    6 年前

    不,这是不允许的。

    IO的整体理念是,没有它,你就无法从中获得价值。 unsafeRunSync . 里面没有“偷看”

    因为可遍历也意味着可折叠,我们来看看为什么 foldLeft 在IO上,打破了“查看内部”规则。

    def foldLeft[A, B](fa: IO[A], b: B)(f: (B, A) => B): B
    

    例如,如果我们 x: IO[Int] (生产 2 )

    foldLeft(x,0)(uuuuuuu),那就必须返回 . 所以我们偷看了里面。 向左折叠 必须这样做 不同步 这打破了参照透明度。

    因此,由于这个(和其他类似的)原因,你不能 Traverse IO .