【もなど】
モナド とは?
最終更新:
💡 値がない場合も含めて、処理を決まったルールでつなぐ
失敗の可能性や入出力など、文脈を伴う計算を決まった規則でつなぐ抽象概念。HaskellではMonad型クラスとして表され、MaybeやIOなどに使われる。
📌 このページのポイント
- HaskellのMaybeはJust(値あり)とNothing(値なし)を表す
- bindは文脈を伴う値と、次の文脈を返す関数をつなぐ操作
- Maybeのbindでは、Nothingなら次の関数を呼ばずNothingを返す
- 値を文脈に入れる操作と、処理の連結に関するモナド則がある
モナドって、結局何なの?
失敗するかもしれない計算や入出力などを、決まったルールでつなぐための抽象概念だよ。最初は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などを、共通の連結ルールで扱うために使う用語だよ。まずは名前の歴史より、値の有無を保って処理をつなぐ例から覚えよう