モナドの>>=がちょっとだけわかったかも
コマンドラインのパイプ"|"と同じになるように処理がつなげるように定義してあるのが各モナドの">>="かな?という感覚を持った。
というか、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"