我试图理解monoid中的关联。
从书中可以看出:
关联只是说你可以关联你的论点 操作方式不同,结果也一样。
例如:
Prelude> (1 + 9001) + 9001
18003
Prelude> 1 + (9001 + 9001)
18003
关于可交换:
这不像通勤或正在进行的操作那样强大 交换。交换意味着你可以重新排序参数 得到相同的结果。加法和乘法是可交换的,但是 (++)列表类型只是关联的。
上面的例子是关联和可交换的,但有什么区别? 我看不出差异。
答案 0 :(得分:11)
以字符串连接为例。假设您使用的语言使用+
进行字符串连接。这自然是联想的,因为分组并不重要:
("a" + "b") + "c" == "abc"
"a" + ("b" + "c") == "abc"
但操作数顺序绝对重要:
"a" + "b" = "ab"
"b" + "a" = "ba"
答案 1 :(得分:8)
关联但不可交换:
矩阵乘法是关联的,但不是可交换的。
(AB)C = A(BC)
可是:
AB != BA
可交换但不关联:
两个数字之差的绝对值是可交换的,但不是关联的。
|a - b| = |b - a|
可是:
||a - b| - c| != |a - |b - c||
答案 2 :(得分:2)
如果幺半群操作是可交换的,我们会"a"<>"b" ≡ "b"<>"a"
。但很明显,"ab"
和"ba"
不是同一个字符串。
关联性是一个相当弱的属性,事实上人们通常认为它对于任何操作来说是“显而易见的/微不足道的”。那么让我们看一下不关联的操作 - 实际上这很简单,例如找到它。 减法:
5 - (3 - 1) = 3
(5 - 3) - 1 = 1
大多数操作既不是关联的也不是可交换的。许多操作是关联的,但不是可交换的。你很少会找到一个可交换但不联想的操作,虽然它很容易构建它; an example from Maths.SE:
(&) :: Int -> Int -> Int
x & y = x*y + 1
这继承了乘法的可交换性,但由于偏移1
而不是关联的。
Prelude> 0 & (1 & 2)
1
Prelude> (0 & 1) & 2
3