我离开Scala已有好几年了(一开始从未真正适应它),而是使用对我来说更容易学习和使用的语言。
我现在回来并重新学习它,并尝试一些可用的库。我最近开始研究Cats,但是在文档的早期却与某些内容相抵触,这让我感到困惑,并且想知道我是否(再次)错过了该语言的一些基本知识。
在page describing typeclasses上,我们看到以下内容:
要获得另一个激励性的差异,请考虑简单配对类型。
final case class Pair[A, B](first: A, second: B)
定义
Monoid[Pair[A, B]]
取决于定义Monoid[A]
和Monoid[B]
的能力,这里的定义是点对的。
首先,我不知道作者所说的“定义是逐点的”。
第二,我不知道为什么定义Monoid[Pair[A, B]]
一定要依赖于定义Monoid[A]
和Monoid[B]
(并且从不解释)。在Monoid
特性中似乎没有任何需要的东西。
答案 0 :(得分:2)
这基本上与Scala或任何编程语言无关。作者仅使用monoid作为一个(大概是众所周知的)示例来演示框架的某些功能。
对于Cats文档的普通读者会有点喜欢monoid的假设并不太牵强,因为:
每位CS学生都不可避免地会遇到由有限字母生成的science周围的free monoids
成千上万的人花了十年来普及 abstraction of "monoid" 因为整个MapReduce故事
完整的句子是
定义
Monoid[Pair[A, B]]
取决于定义Monoid[A]
和Monoid[B]
的能力,这里的定义是点对的。
此句子以monoids为例,以演示有关类型类的内容。它可能想说的是:
让
(A, op_A, 1_A)
和(B, op_B, 1_B)
是两个类半体。然后,笛卡尔积A x B
也可以自然地赋以Monoid结构,如下所示:1_{AxB} := (1_A, 1_B) (a1, b1) op_{AxB} (a2, b2) := (a1 op_A a2, b1 op_B b2)
句子中的定义为“ pointwise”。我认为“ componentwise一词会更合适。 Wikipedia article uses "pairwise"出于任何原因。在这里,我更喜欢“逐分量”而不是“逐点”和“成对”。