Scala 从Cats理解并行类型类

Scala 从Cats理解并行类型类,scala,monads,scala-cats,Scala,Monads,Scala Cats,在Cats中有一个名为Parallel的类型类。这个类的目的是为一些单子提供并行计算,这些单子不支持开箱即用的并行计算,例如or 我知道Monad用于相关计算,因此需要顺序执行Applicative用于独立计算,因此此类计算可以并行化 众所周知,每个Monad都是Applicative(Monad是Applicative函子) 所以现在我不能把理论中的所有概念放在一起。如果所有的单子都是应用程序,为什么我不能使用单子的应用程序性质进行并行计算,我需要这个paralleltypeclass 它只是

Cats
中有一个名为
Parallel
的类型类。这个类的目的是为一些单子提供并行计算,这些单子不支持开箱即用的并行计算,例如
or

我知道
Monad
用于相关计算,因此需要顺序执行
Applicative
用于独立计算,因此此类计算可以并行化

众所周知,每个
Monad
都是
Applicative
(Monad是Applicative函子)

所以现在我不能把理论中的所有概念放在一起。如果所有的单子都是应用程序,为什么我不能使用单子的应用程序性质进行并行计算,我需要这个
parallel
typeclass


它只是
Applicative
支持并行性的一个选项,还是一个要求

你的理解几乎是正确的,但你有一个简单的错误“应用程序用于独立计算”。严格来说,这不是真的,Applicative提供了一种方法,可以将
F
上下文中提升的函数应用于有效值。由此,您可以导出一种方法,获取两个有效值并返回值元组的效果,就是这样。另一方面,Monad接受这一点并添加了顺序性约束,因此它保证在创建元组时,首先计算第一个值,然后计算第二个值。由此可以得出结论,应用程序可以用来执行“并行”操作,而Monad不能,因为Monad有顺序限制,而应用程序没有(但它不能保证并行,例如,它也可以先计算第二个,然后计算第一个,并且仍然有效)。-现在,假设所有的Monad都是应用程序,这意味着您可以在最后一个应用程序上使用前面的方法实现所有的抽象方法,但是您仍然必须遵循Monad规则。因此,它将是连续的。“是的,但实际上不是”我不确定您是否能够为
实现一个“并行”应用程序(我认为不是,但假设是)。问题是,为了一致性,对于每种类型,每个Typeclass应该只有一个实例。因此,对于
(或任何效果),您不应该有两个应用程序。因此,Parallel的使用是为了提供一个新的Typeclass,它既与Applicative无关,也与Monad无关,以便为那些效果提供那些“并行”操作,这些效果是Monad,但可以有一个并行application,但更进一步,如果您检查Parallel的用法,您将看到它在两种类型上是参数化的
M
&
F
(其中,
M
有一个Monad,而
F
有一个Applicative)因此,它也包括Monad本身不能“并行”的情况计算,但你可以将其转换为另一种效果。例如,看看并行的例子,你会看到对于
它会转到
验证的
。而对于它,它使用自己来处理这两种情况,即Monad和Applicative。-因此,在这种情况下,它确实打破了一致性原则,创建了一个新的“并行”的applicative。您可以在源代码中检查它。