ふつける: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

に置き換えられる.

ぶっちゃけ

モナドを理解できてません.副作用がどうとか,まだそんな概念はわからない.第三部をやっていくうちに分かるのかな.