关联和交换之间的区别

zer*_*ing 4 haskell functional-programming monoids

我试图理解monoid中的关联.

从书中可以看出:

关联性简单地说您可以以不同方式关联操作的参数,结果将是相同的.

例如:

Prelude> (1 + 9001) + 9001
18003
Prelude> 1 + (9001 + 9001)
18003
Run Code Online (Sandbox Code Playgroud)

关于交换:

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

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

Jon*_*eet 11

以字符串连接为例.假设您使用的是+用于字符串连接的语言.这自然是联想的,因为分组并不重要:

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

但操作数顺序绝对重要:

"a" + "b" = "ab"
"b" + "a" = "ba"
Run Code Online (Sandbox Code Playgroud)

  • Haskell使用`++`来连接字符串/列表,或者`<>`用于任何monoid.(只是FTR) (3认同)

Ant*_*Xue 8

关联但不可交换:

矩阵乘法是关联的,但不是可交换的.

(AB)C = A(BC)
Run Code Online (Sandbox Code Playgroud)

但:

AB != BA
Run Code Online (Sandbox Code Playgroud)

交换但不联想:

两个数字之间差异的绝对值是可交换的,但不是关联的.

|a - b| = |b - a|
Run Code Online (Sandbox Code Playgroud)

但:

||a - b| - c| != |a - |b - c||
Run Code Online (Sandbox Code Playgroud)