[Haskell-cafe] do notation strangeness

Felipe Lessa felipe.lessa at gmail.com
Sat Dec 8 12:28:58 EST 2007


On Dec 8, 2007 3:12 PM, Ilya Tsindlekht <eilya497 at 013.net> wrote:
> On Sat, Dec 08, 2007 at 02:59:16PM -0200, Felipe Lessa wrote:
> > Prelude> do {1 <- return 3; return' "ok"}
> > Nothing
> > Prelude> return 3 >>= \1 -> return' "ok"
> > *** Exception: <interactive>:1:13-30: Non-exhaustive patterns in lambda
> What seems confusing to you?
>
> \1 -> foo
> is the same as
> \x -> case x of {1 -> foo;}
>
> When this function is evaluated with parameter different from 1, Haskell
> fails to find matching pattern for x and exception occurs.

The problem is that with the do notation it doesn't raise an
exception. In the example you quoted,

do {1 <- return 3; (return "ok" :: Maybe String)}  ==  Nothing  =/=  _|_

The report says
(http://www.haskell.org/onlinereport/exps.html#sect3.14) that the do
above is translated to

let ok 1 = return 3 >> (return "ok" :: Maybe String); ok _ = fail
"..." in return 3 >>= ok
--> let ok 1 = Just 3 >> Just "ok"; ok _ = Nothing in Just 3 >>= ok
--> case Just 3 of {Nothing -> Nothing; Just x -> case x of {1 -> Just
3 >> Just "ok"; _ -> Nothing}}
--> case 3 of {1 -> Just 3 >> Just "ok"; _ -> Nothing}}
--> Nothing

and not as

return 3 >>= \1 -> (return "ok" :: Maybe String)
--> _|_

as I initially thought.


-- 
Felipe.


More information about the Haskell-Cafe mailing list