Разница между ассоциативным и коммутативным
Я пытаюсь понять ассоциативность в моноиде.
Из книги написано:
Ассоциативность просто говорит, что вы можете связать аргументы вашей операции по-разному, и результат будет таким же.
Например:
Prelude> (1 + 9001) + 9001
18003
Prelude> 1 + (9001 + 9001)
18003
А по поводу коммутативных:
Это не такое сильное свойство, как операция, которая коммутирует или является коммутативной. Коммутативность означает, что вы можете изменить порядок аргументов и при этом получить тот же результат. Сложение и умножение являются коммутативными, но (++) для типа списка является только ассоциативным.
Приведенный выше пример является ассоциативным и коммутативным, но в чем разница? Я не вижу разницы.
3 ответа
Возьмите конкатенацию строк в качестве примера. Предположим, вы используете язык, который использует +
для объединения строк. Это естественно ассоциативно, так как группировка не имеет значения:
("a" + "b") + "c" == "abc"
"a" + ("b" + "c") == "abc"
Но порядок операндов определенно имеет значение:
"a" + "b" = "ab"
"b" + "a" = "ba"
Ассоциативный, но не коммутативный:
Матричное умножение ассоциативно, но не коммутативно.
(AB)C = A(BC)
Но:
AB != BA
Коммутативный, но не ассоциативный:
Абсолютное значение разности между двумя числами является коммутативным, но не ассоциативным.
|a - b| = |b - a|
Но:
||a - b| - c| != |a - |b - c||
Если бы моноидная операция была коммутативной, мы бы "a"<>"b" ≡ "b"<>"a"
, Но ясно, "ab"
а также "ba"
не одна и та же строка.
Ассоциативность является более слабым свойством, на самом деле люди часто считают его "очевидным / тривиальным" для любой операции. Итак, давайте посмотрим на операцию, которая не является ассоциативной - на самом деле ее достаточно просто найти, например, вычитание:
5 - (3 - 1) = 3
(5 - 3) - 1 = 1
Большинство операций не являются ни ассоциативными, ни коммутативными. Многие операции являются ассоциативными, но не коммутативными. Вы редко найдете операцию, которая является коммутативной, но не ассоциативной, хотя, опять же, ее легко построить; пример из Maths.SE:
(&) :: Int -> Int -> Int
x & y = x*y + 1
Это наследует коммутативность от умножения, но не является ассоциативным из-за смещения 1
,
Prelude> 0 & (1 & 2)
1
Prelude> (0 & 1) & 2
3