On Fri, 30 May 2008 17:19:54 -0700, "Philip Weaver" <[EMAIL PROTECTED]> said: > > Dear Philip, could you point your virtual finger towards a > > reference/paper/book/any-bleeping-thing that would help this simple > > beginner understand why it doesn't work in this case? I'm trying to > > picture why a "read" function that terminates the program would be > > useful anywhere. In fact, any library function other than something like > > UNIX's "exit" or "kill" which terminates my program is not really > > welcome in any of my computer programs, but then again, I haven't yet > > been illuminated by the genie of pure functional languages. A reference > > would be awesome. > > > Sorry, I wouldn't know where to point you, other than stating the > simple rule that you can't catch exceptions in pure code. Others may > be able to enlighten you better. > > By the way, the example that Dons gave may look more verbose, but > (when possible) it's a probably a better idea to capture failure in a > Maybe than in IO. I gave you "readIO" because it fit in to the > exception handling that you were trying to do, and because you said > you didn't want anyone to tell you you were doing things wrong :).
Here is a private reply from another user, which is more explanatory, the problem was that the read function wasn't getting called at a point where it could have been caught (I'll have to look into that into more detail): All you need is a little strictness, x <- (C.catch (return $! read line :: Int) (\e -> getNum)) works. Another option is using evaluate instead of return. The problem is that (read line :: Int) is not evaluated until it is needed, that is when it's going to be printed, but then it's too late to catch the exception. Some general remarks: hGetLine stdin === getLine do x <- action return x is the same as action _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe