如何实现两个cats.effect.IO monads的非严格排序?

时间:2017-09-27 14:48:52

标签: scala scala-cats

我的计算有三个步骤,如下:

import cats.effect.IO
def step1: IO[Unit] = ???
def step2: IO[Unit] = ???
def step3: IO[Unit] = ???

我可以使用简单的理解顺序将它们组合在一起:

val c: IO[Unit] = for {
  _ <- step1
  _ <- step2
  _ <- step3
} yield ()

在我们的情况下,step3取决于step1step2,因此我们不希望step3step1和{{{{}}之前运行1}}完成。但step2step1是独立的。上面的理解有点不足,因为step2step2完成之前不会开始。我如何表达这种独立性?

我一直在寻找类似step1的内容,它会从scala.concurrent.Future.sequence转换为Seq[IO[A]]。更好的是从IO[Seq[A]]转换为(IO[A], IO[B])。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:0)

我想我找到了它。这似乎有效:

implicitly[cats.Cartesian[IO]].product(step1, step2)

(返回IO[(Unit, Unit)]。)

编辑:更简洁:

import cats.implicits._
step1.product(step2)

答案 1 :(得分:0)

third paragraph of the README中,它明确指出cat-effect库处理并发或并行。