ふつける:11章読んだ
リストモナドから,一気に最後まで.練習問題は別に書きます.
リストモナド
リストモナド,名前こそ恐ろしい感じがするけど,実装はそれほど恐ろしくなかった.
instance Monad [] where xs >>= f = concatMap f xs return x = [x]
言ってみれば,同じ事.
Hugs.Base> concatMap (:[]) [1..5] [1,2,3,4,5] Hugs.Base> [1..5] >>= (:[]) [1,2,3,4,5]
もうちょい色々試そう.
Hugs.Base> return "ho" >>= (++"ge") "hoge" Hugs.Base> return (replicate 3 "ho") >>= (++ ["ge"]) ["ho","ho","ho","ge"]
何がしたいんだ,俺は.
IOモナド
すごい,ふつけるに書いてあるのが呪文に見えてきた.3回ぐらい同じ所を読み返さないと,「何言ってんだか」になっちゃう.
例に寄ると,
main = do cs <- getContents putStr cs
があるとする.このとき,putStr csを行うためには,まずgetContentsをしないといけない.getContentsをしないことにはcsに値は入らず,結果何も出力できないからね.そりゃそうだ.ここで,モナドの概念が役に立つ.
そして,このdo式は,(>>=)を使った式の別の形に過ぎない.例えば,上の式を(>>=)を使った式に置き換えると,こうなる.
main = getContents >>= putStr
アクションgetContentsに,関数putStrを連結して新しいアクションを生成している事になる.
モナドの構文
なんと,do式はモナドのための構文だった.do式は全て(>>=)を使った式に置き換えられ,逆に(>>=)を使った式はdo式に置き換えられる.Maybeモナドを使用した
lookup "3rd" children >>= lookup "mother"
は,
do entries <- lookup "3rd" children lookup "mother" entries
に置き換えられる.
ぶっちゃけ
モナドを理解できてません.副作用がどうとか,まだそんな概念はわからない.第三部をやっていくうちに分かるのかな.