モナドの>>=がちょっとだけわかったかも

コマンドラインのパイプ"|"と同じになるように処理がつなげるように定義してあるのが各モナドの">>="かな?という感覚を持った。
というか、rubyの"."と同じじゃないか!!
やっと以下のURLのイメージが理解できた。
http://www.sampou.org/haskell/a-a-monads/html/analogy.html


Maybeモナド

Prelude> let a=[("a",[("b","c"),("d","e")]),("f",[("g","h"),("i","j")])]
Prelude> lookup "f" a
Just [("g","h"),("i","j")]
Prelude> case lookup "f" a of{Just e->lookup "i" e; Nothing -> Nothing}
Just "j"
Prelude> lookup "f" a >>= lookup "i"
Just "j"
Prelude> lookup "f" a >>= lookup "k"
Nothing
Prelude> lookup "z" a >>= lookup "k"
Nothing

Listモナド

Prelude> map (\x->if x=='b' then "z" else [x]) "abcd"
["a","z","c","d"]
Prelude> concat $ map (\x->if x=='b' then "z" else [x]) "abcd"
"azcd"
Prelude> concatMap (\x->if x=='b' then "z" else [x]) "abcd"
"azcd"
Prelude> "abcd" >>= (\x->if x=='b' then "z" else [x])
"azcd"
Prelude> let sub a b = \x->if x==a then b else [x]
Prelude> "abcd">>=sub 'b' "x"
"axcd"
Prelude> "abcd">>=sub 'b' "x">>=sub 'c' "y"
"axyd"