モナド

11.1 モナドとは何か


う〜ん、モナドの定義だけでは分かりません。難しいです。
やっぱり具体例がないと分かりませんね。
Monadクラスの定義とモナド則を頭の片隅に置きつつ、次に進みます。

11.2 Maybeモナド


いつぞやbさんにコメントで書いて頂いたMaybeが出てきました。
Maybeはモナドだったんですね。
そもそもの定義はこんな感じ。

data Maybe a = Nothing | Just a deriving (Eq, Ord, Read, Show)


本書中に書かれているように、Maybeを使うと処理に成功したかどうか、と
その処理の結果を分離しつつ、戻り値として一発で返すことが出来るんですね。
Nothingであれば処理失敗、そうでなければJust aのaが処理結果。


C言語で比較してみますと、文字列に関してだけ言えば、
NULLを返せば失敗、NULL以外であれば成功で何らかの文字列が返される感じですね。


このように処理失敗でNothing、成功でJust aを返す関数をいくつかつなぎ合わせると
その合成した関数も同じように処理失敗でNothing、成功でJust aを返す関数になります。
しかも関数の途中で失敗したらそれ以降の関数適用は行わないこも可能です。


これが「演算をつなぐ」の意味ですね。
なんとな〜くですが、分かるような気がしますが、全然自信がありません。


Maybe型の他の定義も見てみます。

maybe              :: b -> (a -> b) -> Maybe a -> b
maybe n f Nothing  =  n
maybe n f (Just x) =  f x


maybe関数の使い方はこんな感じ。

Prelude> maybe 0 (+ 1) (Just 1)
2
Prelude> maybe 0 (+ 1) Nothing
0


何らかの関数の結果を3つ目の引数に指定する、という使い方が便利そうです。
これもまさに「演算をつなぐ」感じがします。


今日はこれくらいで。
ちょっとずつ進めていきます。う〜ん、難しい!