我目前正在学习scala中的范畴理论和相关性法则
(x + y)+ z = x +(y + z)
使用两个以上的值时,这很好
("Foo" + "Bar") + "Test" == "Foo" + ("Bar" + "Test") // true
在这种情况下,顺序并不重要。但是如果只有两个值呢?如果数字仍然有效(可交换),但在使用字符串做同样的事情时它会失败。
3+1==1+3 // True
("Foo" + "Bar") == ("Bar" + "Foo") // Not commuative
那么说相关性需要交流来满足幺半群法则是合法的吗?那么String Monoid是否有效?
答案 0 :(得分:4)
那么说关联性需要交换性来实现幺半群法则是合法的吗?
没有。二元运算不需要是可交换的可交换的。 ("Foo" + "Bar") == ("Bar" + "Foo")
为假的事实与+
与String.
无论如何,String Monoid是否有效?
是的,您可以拥有Monoid[String]
。
根据定义:
monoid是在关联二元操作
+
下关闭的集合,在I
中具有标识元素S
,以便{{1}中的所有a
我是S
。monoid必须包含至少一个元素。
让+ a = a + I = a
成为+
的二元运算。对于任何两个字符串Monoid[String]
和a
,b
也是a + b
,因此二进制操作在String
类型上关闭。如果没有严格的证据,我们也知道它是相关的。
即。对于所有字符串String
,a
和b
:
c
我们还有一个标识元素(a + b) + c == a + (b + c)
(空字符串),因为对于任何字符串""
,a
和a + "" == a
。
其二进制运算也是可交换的monoid称为可交换的monoid 。并且您显然无法使用"" + a == a
操作为String
提供可交换的幺半群。