
Hello! I see from http://www.haskell.org/haskellwiki/Monads_as_computation#Do_notation that do { v <- x ; <stmts> } = x >>= \v -> do { <stmts> } However, look at this GHCi session: Prelude> let return' = return :: a -> Maybe a Prelude> do {1 <- return 1; return' "ok"} Just "ok" Prelude> return 1 >>= \1 -> return' "ok" Just "ok" Prelude> do {1 <- return 3; return' "ok"} Nothing Prelude> return 3 >>= \1 -> return' "ok" *** Exception: <interactive>:1:13-30: Non-exhaustive patterns in lambda Hmmm... let's try with IO: Prelude> let return' = return :: a -> IO a Prelude> do {1 <- return 1; return' "ok"} "ok" Prelude> return 1 >>= \1 -> return' "ok" "ok" Prelude> do {1 <- return 3; return' "ok"} *** Exception: user error (Pattern match failure in do expression at <interactive>:1:4) Prelude> return 3 >>= \1 -> return' "ok" *** Exception: <interactive>:1:13-30: Non-exhaustive patterns in lambda Oh! What about lists? Prelude> let return' = return :: a -> [a] Prelude> do {1 <- return 1; return' "ok"} ["ok"] Prelude> return 1 >>= \1 -> return' "ok" ["ok"] Prelude> do {1 <- return 3; return' "ok"} [] Prelude> return 3 >>= \1 -> return' "ok" *** Exception: <interactive>:1:13-30: Non-exhaustive patterns in lambda Something seems wrong to me here. What am I missing? Thanks! -- Felipe.