Monoid[String] 真的是 scala 中的 Monoid

Jay*_*Jay 1 scala category-theory monoids

我目前正在学习 scala 中的范畴论,结合律说

(x + y) + z = x + (y + z)

当使用两个以上的值时就很好了

("Foo" + "Bar") + "Test" == "Foo" + ("Bar" + "Test") // true
Run Code Online (Sandbox Code Playgroud)

在这种情况下,顺序并不重要。但是如果只有两个值怎么办?对于数字,它仍然有效(可交换),但是当对字符串执行相同的操作时,它会失败。

3+1==1+3 // True
("Foo" + "Bar") == ("Bar" + "Foo") // Not commuative
Run Code Online (Sandbox Code Playgroud)

那么,说结合性需要交换性来满足幺半群定律是否合法?那么字符串 Monoid 是否有效?

Mic*_*jac 5

那么说结合性需要交换性来满足幺半群定律是否合法?

不。二元运算不需要通过交换就能结合。错误的事实与关联的("Foo" + "Bar") == ("Bar" + "Foo")事实无关+String.

那么字符串 Monoid 是否有效?

是的,您可以拥有一个Monoid[String].

根据定义:

幺半群是在关联二元运算下闭合的集合+,并且具有单位元素,I使得S对于所有ain S, I + a = a + I = a

幺半群必须包含至少一个元素。

+是 a 的二元运算Monoid[String]。对于任意两个字符串aba + b也是String,因此二元运算在类型 上是封闭的String。无需严格证明,我们也知道它是结合律的。

即对于所有字符串abc

(a + b) + c == a + (b + c)
Run Code Online (Sandbox Code Playgroud)

我们还有一个单位元素""(空字符串),因为对于任何字符串a,a + "" == a"" + a == a

二元运算也是可交换的幺半群称为可交换幺半群。显然,您不能使用可交换幺半群来String使用该+操作。