【もなど】

モナド とは?

最終更新:
💡 値がない場合も含めて、処理を決まったルールでつなぐ

失敗の可能性や入出力など、文脈を伴う計算を決まった規則でつなぐ抽象概念。HaskellではMonad型クラスとして表され、MaybeやIOなどに使われる。

📌 このページのポイント
モナド:Maybeのbindを例に値あり・値なしを保って処理をつなぐ✓ 値がある:Just 3Just 32倍にしてJustで返すJust 6値がない:NothingNothing関数は呼ばないNothing同じbindでも、文脈に応じて進み方が変わる
Maybeを使った具体例です。モナドにはIOなど別の文脈もあります。
ひよこ ひよこ
モナドって、結局何なの?
ペンギン先生 ペンギン先生
失敗するかもしれない計算や入出力などを、決まったルールでつなぐための抽象概念だよ。最初はHaskellのMaybeで考えよう。Just 3は「値3がある」、Nothingは「値がない」を表すんだ
ひよこ ひよこ
「箱」のたとえはどう使うの?
ペンギン先生 ペンギン先生
値とその文脈を一緒に扱うイメージには役立つよ。ただ、モナドが全部、実際の箱のような入れ物という意味ではないんだ。Maybeなら「値あり・値なし」の違いを保つ、と具体的に考えると分かりやすいね
ひよこ ひよこ
bindって何をつなぐの?
ペンギン先生 ペンギン先生
文脈を伴う値と、通常の値を受け取って文脈を伴う結果を返す関数をつなぐよ。MaybeではJust 3と「数を2倍にしてJustで返す関数」をつなぐとJust 6になる。一方、Nothingならその関数を呼ばず、Nothingのままになるんだ
ひよこ ひよこ
使えばバグや失敗がなくなる?
ペンギン先生 ペンギン先生
なくなるわけではないよ。値がない場合の扱いなどを共通の仕組みに寄せられるので、同じ分岐を繰り返し書く負担を減らせる。値を文脈に入れる操作や、連結の仕方が整合するためのモナド則も大切なんだ
ひよこ ひよこ
JavaScriptのPromiseも同じ?
ペンギン先生 ペンギン先生
thenで次の処理へつなぐ点は似ているね。でもPromiseはHaskellのMonad型クラスそのものではなく、値や例外の扱いもJavaScriptの規則による。thenという名前のメソッドがあれば、何でも同じモナドとして扱えるわけではないよ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「モナド」って出てきたら「値の有無などの文脈を保ちながら処理をつなぐ仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Monad」 = モナド(文脈を伴う計算をつなぐ抽象概念)
💬 プログラミングではMaybeやIOなどを、共通の連結ルールで扱うために使う用語だよ。まずは名前の歴史より、値の有無を保って処理をつなぐ例から覚えよう

参考資料

← 用語集にもどる