以下のhogeとhoge'は同じかと思ってたけど、別物。
hoge :: [Int]
hoge = do
Just x <- [Just 3, Just 2, Nothing, Just 4]
return x
hoge' :: [Int]
hoge' = [Just 3, Just 2, Nothing, Just 4] >>= (\ (Just x) -> return x)
http://www.haskell.org/onlinereport/exps.html によると、do記法の書き換えは以下なので。
do {p <- e; stmts} = let ok p = do {stmts}
ok _ = fail "..."
in e >>= ok
動きから予想はしてたけど、やっぱ fail かあ。。。