Monad or monoid?
専門的な定義は、モノイドは恒等式を持つ半群であることです。
つまり、モノイドは「直感的に動作する、たくさんの材料と、その材料で行うこと」なのです。 これは非常に曖昧です。 でも、そういうことなんです。 非常に頻繁に、このような振る舞いをするものは、加算のように「感じ」ます。
たとえば、棒の束を押し付けるような感じです。
-
いくつかの棒があり、それらを一緒に押し込むと、その山には何があるでしょうか。 棒でしょ? そうだ。
-
最初に小さな山に押し込んで、次にその山を自分の周りに再グループ化して、一緒に押し込んだらどうでしょう? それはまだスティックの山のようなものですか? 左側の棒を先に押し込んでから、残りの棒を押し込んだらどうでしょう? そうです。 それは基本的に同じ棒の山ですか? Yup.
-
もし私がスティックの束を持っていて、No Sticksを突っ込んだら・・・何か変わりましたか? いや…
最初の2つは半群になるものです。
#1 は二項演算のもとでの閉包です。 確かに棒はたくさんあるけど、2群に分けたり、棒を1本ずつ追加したり、いろいろできるんだ。 Shoveで操作して棒をまとめると、最後にはまだ棒のままのモノがある。 カエルになったわけでもなく、彫ったわけでもないんですけどね。
火は二項対立でないだけでなく、閉鎖的でもない — もし私が棒に火を使ったら、最後に棒ができますか? いや、そうでもないです。 焼け焦げた棒は確かにあります — これは顕著なことに、火による操作を受けた棒です。 つまり、評価する順番は関係ないってことです。
#3 は恒等式。 これは0に相当するもので、これを受け取って演算を適用しても何も変わりません。 プログラミングの観点からは、文字列の連結は数学ではない良い例です。
2項演算は何でしょうか。 連結です。 物事を結合することです。 (足し算のように感じると言ったことを思い出してください!) 一度に 2 つの部分に対してのみ操作するのです。 もし100万語あったとしても、1つを別のものに足すなどして行います。 a + b => ab
その操作では閉じているのでしょうか? クロージャとは、”この種のものを持っていて、それに何か操作をして、それでも最後にその種のものがある “という意味です。 だから、文字列をくっつけていくと…長い文字列になるんです!(笑 そう、これは文字列なんです。 かっこいい!
それは連想型ですか? そうです。 これは順序が重要でないという意味ではなく、評価の順序が重要でないという意味です。 he + llo
は h + ello
や h + el + lo
や h + (el + lo)
や (h + el) + lo
や ((h + (e + l) + l) + o
が最後に hello
であるのと同じ結果になるのです。 (なお、ここでいう「順序が重要」とは、 — he + llo
は lh + elo
と同じか? いいえ、hello
はlhelo
ではありません。
この操作のためのIDはありますか? はい — 空の文字列です。 apple + ""
は apple
です。 まだ文字列です。 ""
も文字列ですが、何も入っていない文字列です。 ですから、これを演算に使っても文字列が得られます — 実際には、最初に使ったのと同じ文字列です!
。