2017-06-26 5 views
3

私はモノイドのアソシエイティブを理解しようとしています。アソシエイティブと可換の違い

ブックから、それは言う:

結合性は、単にあなたが異なっあなた 操作の引数を関連付けることができると言う、結果は同じになります。例えば

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

約可換:

これは、通勤や可換 で動作ほど強いプロパティではありません。 Commutativeは引数を並べ替えることができ、それでも は同じ結果を得ることを意味します。加算と乗算は可換ですが、リストタイプの場合は (++)は連想のみです。

上記の例は連想性と可換性ですが、違いは何ですか? 違いはわかりません。

+1

が注...彼らは、操作のための一般的な概念です。 –

+0

'a +(b + c)==(a + b)+ c'と' a + b == b + a'の違いは疑問ですか? – immibis

答えて

11

例として文字列連結を取ります。文字列連結に+を使用する言語を使用しているとします。グループ化は問題ではないとしてそれは、自然に連想です:

("a" + "b") + "c" == "abc" 
"a" + ("b" + "c") == "abc" 

しかし、オペランドの順序は間違いなく重要:

"a" + "b" = "ab" 
"b" + "a" = "ba" 
+3

Haskellは、文字列/リストの連結に '++'を使用しています。 (Just FTR) – leftaroundabout

+0

@leftaroundについて:私は複数の言語のプログラマーには馴染みのある例を挙げようとしていました。ここでは、モノイドやHaskellに特有のものは何もありません。答えを編集します。 –

2

monoid操作が可換であった場合は、"a"<>"b" ≡ "b"<>"a"となります。しかし、明らかに、"ab""ba"は同じ文字列ではありません。

Associativityはかなり弱いですが、実際には、約の操作では「明白/自明」とみなされることがよくあります。操作だから、ではなく、の操作を見てみましょう。 減算

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 
+0

正確に結合しているものは何ですか?私はいつも考えていた、その連想は可換である。 –

7

連想たが可換ではない:

行列の乗算が連想されるが、しかし、可換ではない

(AB)C = A(BC) 

しかし:

AB != BA 

可換なく連想しない2つの数の間の差の

絶対値が可換であるが、連想しません。

|a - b| = |b - a| 

しかし:結合性と可換性は、関数型プログラミング、Haskellのかモノイドには本当に固有のものではありませんことを

||a - b| - c| != |a - |b - c|| 
関連する問題