Scala 在cats效应中是否存在异步并行?

Scala 在cats效应中是否存在异步并行?,scala,scala-cats,Scala,Scala Cats,我注意到,即使在最强大的类型类ConcurrentEffect中,cats效果类型类层次结构也不会从cats核心继承并行。仅当您直接使用IO时,为parallel提供的唯一实例才存在 但是不应该有一个吗?我觉得Sync[F]和Async[F]应该是并行[F]的好搭档。并行行为与Sync和Async层次结构所承诺的顺序但异步执行是完全不同的。ConcurrentEffect承诺您的计算在线程池上运行,并且可以取消+其较小元素承诺的所有内容-仍然不能组合并行计算,但允许您实现竞争。Parallel是

我注意到,即使在最强大的类型类ConcurrentEffect中,cats效果类型类层次结构也不会从cats核心继承并行。仅当您直接使用IO时,为parallel提供的唯一实例才存在

但是不应该有一个吗?我觉得Sync[F]和Async[F]应该是并行[F]的好搭档。

并行行为与Sync和Async层次结构所承诺的顺序但异步执行是完全不同的。ConcurrentEffect承诺您的计算在线程池上运行,并且可以取消+其较小元素承诺的所有内容-仍然不能组合并行计算,但允许您实现竞争。Parallel是一种正交语义,这就是它作为单独的类型类/类型约束传递的原因。因此,只需将其添加为单独的类型约束即可

def toStringParallel[F[_]: Sync: Parallel](list: List[F[Int]]): F[List[String]] =
  list.parTraverse(a => a.toString.pure[F])

object App1 extends IOApp {
  def run(args: List[String]) = toStringParallel[IO](List(IO(1), IO(2)))
    .as(ExitCode.Success)
}
如果无法实例化并行[IO],请记住这一点

并行行为与Sync和Async层次结构所承诺的顺序但异步执行是完全不同的。ConcurrentEffect承诺您的计算在线程池上运行,并且可以取消+其较小元素承诺的所有内容-仍然不能组合并行计算,但允许您实现竞争。Parallel是一种正交语义,这就是它作为单独的类型类/类型约束传递的原因。因此,只需将其添加为单独的类型约束即可

def toStringParallel[F[_]: Sync: Parallel](list: List[F[Int]]): F[List[String]] =
  list.parTraverse(a => a.toString.pure[F])

object App1 extends IOApp {
  def run(args: List[String]) = toStringParallel[IO](List(IO(1), IO(2)))
    .as(ExitCode.Success)
}
如果无法实例化并行[IO],请记住这一点


谢谢你的回答。我明白你的意思。但我仍然想知道,在给定ContextShift的情况下,是否可以为异步派生一个并行实例?对于并行F~>F,我们可以执行Async.shift*>F,对于顺序F~>F,我们可以执行Sync.delay。或者与之相符的东西谢谢你的回答。我明白你的意思。但我仍然想知道,在给定ContextShift的情况下,是否可以为异步派生一个并行实例?对于并行F~>F,我们可以执行Async.shift*>F,对于顺序F~>F,我们可以执行Sync.delay。或者与之相一致的东西