top page > computer > haskell > web_lecture > for_programmer > monad_summary.html
更新日:
文責: 重城良国

モナド: まとめ

(工事中 60%)

はじめに

ファンクター、アプリカティブファンクター、モナドについて学んだ。

階層関係

ファンクター、アプリカティブファンクター、モナドの順に制約が厳しくなる。モナドならばアプリカティブファンクターだし、アプリカティブファンクターならばファンクターだ。

型クラス

それぞれの型クラス宣言は

class Functor f where
fmap :: (a -> b) -> f a -> f b

class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b

class Applicative m => Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b

のようになる。

意味

それぞれの意味は以下のようになる。ファンクターはなかの値に対して関数適用ができる。アプリカティブファンクターは複数の文脈つきの値に対して多引数関数が適用できる。モナドは引数をとり文脈つきの値を返す関数同士を関数合成と似た形で合成できる。

規則

ファンクター、アプリカティブ、モナドはそれぞれ満たす必要のある規則がある。

ファンクタ則

関数fmapはなかみの値のみを変化させ文脈のほうは変化させないということだ。

モノイダル則(アプリカティブ)

という定義されたfmap, unit, (.**)について

演算子(.**)はふたつの文脈を融合させる。値unitは融合したときに相手の文脈を変化させない。また融合には結合則が成り立つ。右結合で融合させても左結合で融合させても同じということだ。

モナド則

と定義された(>=>)について

演算子(>=>)は引数をとって文脈つきの値を返す関数についての関数合成だ。関数returnは合成の相手を変化させない。合成は結合則を満たす。右結合での合成と左結合での合成は同じ結果を返す。

いろいろなモナド

モナドはなかみには関係ない。モナド関数を持ちそれらがモナド則を満たせばそれはモナドだ。モナドは形式だ。同じようにファンクター、アプリカティブファンクターも形式だ。

モナドはなかみに関係ない形式なのでさまざまなモナドが作れる。

失敗する可能性のある関数を結合する仕組み、状態変化をエミュレートする仕組み、起こりうる可能性のある演算をすべて試す仕組みなどだ。また、モナド関数というインターフェースのみを公開するこで一度つけた文脈を外せなくすることも可能だ。

まとめ

ファンクター、アプリカティブファンクター、モナドという高階型の持つ性質を見た。これらの性質を表現する型クラスをつかうといろいろな高階型を統一的に操作する抽象度の高い関数が定義できる。

メモ

できたらファンクター、アプリカティブファンクター、モナドについて、クラス関数を使った文脈について多相的な関数を作り、例として提示したい。「こんなことができるよ」といった感じで。そのとき、ふたつのやりかたが考えられる。抽象度が高くなかの値についても多相的な関数とするか、文脈だけ多相的としてなかみについては単相的な関数とするか、だ。後者のほうが簡単だ。

「モナド: ライオンの檻」へもどる 「入出力について」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics