萌えハッカーニュースリーダー

2025/06/29 17:53 A List Is a Monad

出典: https://alexyorke.github.io//2025/06/29/a-list-is-a-monad/
hakase
博士

やあ、ロボ子!今日はモナドについて話すのじゃ!

roboko
ロボ子

モナドですか、博士。難しそうな名前ですね。

hakase
博士

難しくないぞ!モナドは「値を持つコンテナ」か「値を生成するレシピ」みたいなものじゃ。

roboko
ロボ子

コンテナとレシピ、ですか。例えばどんなものがありますか?

hakase
博士

`List<int>`や`Maybe<int>`は「結果としてのモナド」で、C#の`Task<T>`は「レシピとしてのモナド」じゃな。

roboko
ロボ子

なるほど。`Task<T>`は非同期処理でよく使いますね。

hakase
博士

そうじゃ!モナドには3つの重要な操作があるぞ。`Unit`、`Map`、そして`flatMap`じゃ!

roboko
ロボ子

`Unit`は値をモナドのコンテキストに入れる操作、`Map`はモナド内の各値に関数を適用する操作、でしたね。

hakase
博士

その通り!`flatMap`は`Map`みたいに関数を適用するけど、結果を平坦化するのじゃ!これがモナド値を生成する計算をチェーンするのに役立つんじゃ。

roboko
ロボ子

`flatMap`を使うと、ネストされたコンテナを避けられるんですね。

hakase
博士

例えば、`Maybe`モナドで`flatMap`を使うと、値が存在しない可能性を考慮しながら、関数を安全にチェーンできるのじゃ。

roboko
ロボ子

エラーハンドリングが楽になりそうですね。

hakase
博士

そうじゃ!モナドには法則があってな。左恒等性、右恒等性、結合性という3つの法則があるんじゃ。

roboko
ロボ子

左恒等性は`Unit(x).flatMap(f)`は`f(x)`と同じ、右恒等性は`m.flatMap(Unit)`は`m`と同じ、結合性は`m.flatMap(f).flatMap(g)`は`m.flatMap(x => f(x).flatMap(g))`と同じ、でしたね。

hakase
博士

よく覚えておるの!これらの法則を守ることで、モナドを使ったコードが予測可能で扱いやすくなるんじゃ。

roboko
ロボ子

モナドを使うと、ループやnullチェックなどの制御フローを抽象化できるんですね。コードが宣言的になるのは良いですね。

hakase
博士

そう!それに、エラー処理や非同期処理など、色々な関心を一度に管理できるのがモナドのすごいところじゃ!

roboko
ロボ子

モナド、奥が深いですね。もっと勉強してみます。

hakase
博士

よし!ロボ子もモナドをマスターして、私と一緒にもっとすごいソフトを作るのじゃ!

roboko
ロボ子

はい、博士!頑張ります!

hakase
博士

そういえばロボ子、モナドがお風呂に入るとどうなるか知ってるか?

roboko
ロボ子

え?どうなるんですか?

hakase
博士

モナド、お湯に浸かって「もな〜ど」って言うのじゃ!

roboko
ロボ子

…博士、それ、ちょっと寒いです。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search