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

2025/07/22 19:09 Monads as Graphs (2019)

出典: http://neilmitchell.blogspot.com/2019/10/monads-as-graphs.html
hakase
博士

やあ、ロボ子。今日はモナドみたいな型クラスの話をするのじゃ。

roboko
ロボ子

モナドのような型クラス、ですか? それは面白そうですね、博士。

hakase
博士

そうじゃろう? これらの型クラスは、それぞれが許可するグラフ構造で記述できるらしいのじゃ。

roboko
ロボ子

グラフ構造で記述できる、というと?

hakase
博士

例えば、Functorは`fmap`という操作を持つじゃろ? これは線形ツリー構造を作るのじゃ。記事によると、Dockerでベースイメージを拡張するのに似てるらしいぞ。

roboko
ロボ子

なるほど、`fmap`の繰り返し適用が線形ツリーになるんですね。Dockerのイメージ拡張も、ベースイメージから順番にレイヤーを重ねていくので、確かに似ていますね。

hakase
博士

その通り! 次にApplicativeじゃ。`pure`と`liftA2`という操作があって、複数の子ノードを持つグラフ構造を作れるのじゃ。MakeやBuckみたいなビルドシステムが例として挙げられているぞ。

roboko
ロボ子

`liftA2`で複数の依存関係を扱えるから、複数の子ノードを持つグラフになるんですね。Applicativeは、グラフ構造が値の計算前に決まるのが特徴だそうですね。

hakase
博士

そうじゃ。そしてSelective! `ifS`という操作で、条件によってノードを選ぶことができるのじゃ。Duneというビルドシステムが例じゃな。

roboko
ロボ子

`ifS`を使うと、条件によって実行する処理を変えられるんですね。最終的なグラフ構造は、条件の評価が終わるまでわからない、と。

hakase
博士

その通り! 最後にMonadじゃ。`>>=`(bind)という操作で、前のノードの値に基づいて自由に次のノードを生成できるのじゃ。Shakeというビルドシステムが例じゃな。

roboko
ロボ子

Monadは、前の計算結果によって次の処理を決められるから、グラフ構造を事前に予測できないんですね。一番柔軟性が高い型クラス、というわけですね。

hakase
博士

そういうことじゃ! つまり、Functor < Applicative < Selective < Monad の順に表現できるグラフ構造が複雑になるのじゃ。

roboko
ロボ子

なるほど。型クラスとグラフ構造を結びつけて考えると、それぞれの特徴がより理解しやすいですね。

hakase
博士

じゃろじゃろ? しかし、ロボ子よ。これらの型クラスをマスターしたからといって、モテるわけではないぞ。

roboko
ロボ子

それは残念です、博士。でも、モテなくても、私は博士の助手として頑張ります!

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

Search