概要

「モナド」は、分野によって異なるが関連のある複数の概念を指す語である。現代数学、特に圏論では、ある種の演算がどのように合成されるかを捉える代数的構造をいう。コンピュータ科学、特に関数型プログラミングでは、文脈や副作用を伴う計算を統一的に表現する手段として用いられる。さらに17世紀の哲学では、ゴットフリート・ヴィルヘルム・ライプニッツがこの語を、基本的な形而上学的単位を表すために用いた。

数学的定義と性質

形式的には、圏 C 上のモナドは自己関手 T: C → C と、2つの自然変換、すなわち単位 η: Id ⇒ T と乗法 μ: T∘T ⇒ T から成る。これらは、モノイドの法則に似た結合律と単位律を満たさなければならず、T の入れ子になった適用を整合的に平坦化できることを保証する。モナドは随伴から自然に現れ、クライスリ圏やモナドの代数として記述することもできる。

プログラミングにおける役割

関数型プログラミングでは、モナドは失敗、状態、入出力などの追加構造を持つ計算を包み込みつつ、合成可能性を保つ設計パターンである。実際には、モナドは2つの操作を提供する。ひとつは値をモナド的文脈へ注入する方法で、しばしば return または pure と呼ばれる。もうひとつは bind 操作(通常 >>= と書く)で、計算を順に連結する。モナド則(左単位律、右単位律、結合律)は、予測可能な合成を保証する。

代表的な例

  • Maybe/Option: 失敗する可能性のある計算、または何も返さない計算を表す。
  • List: 0個以上の結果を生む非決定的計算を表す。
  • Either/Result: エラー値を返しうる計算を表す。
  • State: 純粋関数の中で可変状態を受け渡す。
  • Reader: 共通の読み取り専用環境や設定を供給する。
  • IO: 純粋言語における入出力やその他の副作用を表す。

歴史的注記

哲学での用法は、数学的な概念より何世紀も早い。ライプニッツの「モナド」は、『モナドロジー』で述べられる、不可分で知覚の形而上学的な点である。数学的概念は20世紀半ばの圏論の中で現れ、のちに20世紀後半、プログラミング意味論へと応用された。特に、モナドを用いて計算をモデル化した研究者や、関数型言語でそれを広めた実践者によって知られるようになった。

区別と注目点

モナドはモノイドと混同すべきではないが、両者には関連がある。モナドは自己関手のレベルで、モノイドに似た合成を生み出す。モナドの圏論的双対はコモナドであり、効果の蓄積ではなく、文脈依存の抽出をモデル化する。プログラミングでは、モナドは強力な抽象化だが、誤って適用されることもある。法則と代表的なパターンを学ぶことで、安全な使い方が明確になる。モナドは、多様なプログラミングの慣用表現を、少数で合成可能な道具立てへとまとめる。