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.
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe