关联和交换之间的区别

时间:2017-06-26 12:13:58

标签: haskell functional-programming monoids

我试图理解monoid中的关联。

从书中可以看出:

  

关联只是说你可以关联你的论点   操作方式不同,结果也一样。

例如:

Prelude> (1 + 9001) + 9001
18003
Prelude> 1 + (9001 + 9001)
18003

关于可交换:

  

这不像通勤或正在进行的操作那样强大   交换。交换意味着你可以重新排序参数   得到相同的结果。加法和乘法是可交换的,但是   (++)列表类型只是关联的。

上面的例子是关联和可交换的,但有什么区别? 我看不出差异。

3 个答案:

答案 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