我想组合IO
应该并行独立运行的多个值。
val io1: IO[Int] = ???
val io2: IO[Int] = ???
正如我所看到的,我必须选择:
- 使用具有分叉连接模式的猫效应纤维
val parallelSum1: IO[Int] = for { fiber1 <- io1.start fiber2 <- io2.start i1 <- fiber1.join i2 <- fiber2.join } yield i1 + i2
- 将
Parallel
实例用于IO
withparMapN
(或其同级之一,如,parTraverse
等)parSequence
parTupled
val parallelSum2: IO[Int] = (io1, io2).parMapN(_ + _)
不确定每种方法的优缺点,以及何时应该选择其中一种。当对效果类型进行抽象时,这变得更加棘手IO
(无标签最终样式):
def io1[F[_]]: F[Int] = ???
def io2[F[_]]: F[Int] = ???
def parallelSum1[F[_]: Concurrent]: F[Int] = for {
fiber1 <- io1[F].start
fiber2 <- io2[F].start
i1 <- fiber1.join
i2 <- fiber2.join
} yield i1 + i2
def parallelSum2[F[_], G[_]](implicit parallel: Parallel[F, G]): F[Int] =
(io1[F], io2[F]).parMapN(_ + _)
typeclassParallel
需要 2 个类型构造函数,使用起来有点麻烦,没有上下文边界,并且有一个额外的 vague 类型参数G[_]
感谢您的指导:)
阿弥陀佛