モナド

2024/07/17

数学

モナドとは

モナドは、もともとライプニッツが提唱した哲学上の概念で、現在ではしばしば圏論やプログラミングの文脈で用いられる。

モナド(哲学)

哲学におけるモナドは、単子と訳され、それ以上分割できない単一の実体。アトムとは異なり、空間的な広がりを持たず、それ故に物質ではないとされている。

モナドは「状態」を持っており、その「状態」は他のすべてのモナドの状態を反映して決まる(表象能力)。モナド同士は互いに独立していて他のモナドからの影響を一切受けないため、他のモナドの「状態」との対応(表象能力)については予定調和の原理によって説明されるとのこと。詳細についてはモナドロジーを参照されたい。

単一の実体は表象を通して外界へつながっていて、以下のようなイメージで表現できる。

Notion Image

モナド(圏論)

圏論におけるモナドは、モノイドに似た構造を持つ自己関手の一つ。モナドは圏CC上の自己関手T:CCT:C\to Cと2つの自然変換η:id˙T\eta:id\dot{\to}Tμ:T2˙T\mu:T^2\dot{\to}Tの組(T,η,μ)(T, \eta, \mu)のことで、

Notion Image

以下の可換図式を満たす。

Notion Image

ここで、T(μA)T(\mu_A)μT(A)\mu_{T(A)}T(ηA)T(\eta_A)ηT(A)\eta_{T(A)}の違いについて補足しておく。T(μA)T(\mu_A)μA:T(T(A))T(A)\mu_A:T(T(A))\to T(A)を関手TTで移したものである(1)。μT(A)\mu_{T(A)}T(A)T(A)を一塊とした自然変換μ\muT(A)T(A)成分、すなわち、T(T(A))T(A)T(T(A))\to T(A)AAT(A)T(A)で置き換えたもの(2)。T(ηA)T(\eta_A)ηA:AT(A)\eta_A:A\to T(A)を関手TTで移したものである(3)。ηT(A)\eta_{T(A)}T(A)T(A)を一塊とした自然変換η\etaT(A)T(A)成分、すなわち、AT(A)A\to T(A)AAT(A)T(A)で置き換えたもの(4)。

Notion Image

また、「モナドは自己関手圏におけるモノイド対象」と表現されることもある。これは、「モナドは、自己関手TTを対象、自然変換η\etaμ\muを射、関手の合成を演算とした圏を考えたときの、モノイドの性質を持った対象のこと。より正確にはモノイド対象と表現され、モノイド圏(C,,I,α,l,r)(C, \otimes, I, \alpha, l, r)が与えられた時の圏CCの対象MMと乗法μ\mu、単位射η\etaと呼ばれる2つの射の組(M,μ,η)(M, \mu, \eta)のこと。」と言い換えられる。なお、モノイド対象は、以下の可換図式を満たす。

Notion Image

モナド(関数型プログラミング)

関数型プログラミングでは、圏はたかだか集合論の範囲に限定されるため、以下のように読み替えても構わない。

  • 圏:集合(型あるいは値)
  • 対象:集合(型あるいは値)
  • 射:関数
  • 射の合成:関数の合成
  • η\eta:unit関数
  • μ\mu:flat関数
  • 関数型プログラミングにおけるモナドは、裸の値(あるいは型)に文脈を付与するための箱(入れ物)のようなもので、どんな文脈を持ったものでも、箱に入れたまま統一的に扱えるようにしたデザインパターン。これにより、メソッド内の副作用を文脈として値自身に付与することで、参照透過性を維持したまま副作用の扱うことが可能になる。

    Notion Image

    参考資料


    著者画像

    ゆうき

    2018/04からITエンジニアとして活動、2021/11から独立。主な使用言語はPython, TypeScript, SAS, etc.