[Haskell-cafe] [Newbie question] -- Looping stdin until condition
is met
Philip Weaver
philip.weaver at gmail.com
Fri May 30 19:54:18 EDT 2008
On Fri, May 30, 2008 at 5:28 PM, Martin Blais <blais at furius.ca> wrote:
> Allright, this is a definitely a newbie question.
>
> I'm learning Haskell and going through the exercises in the
> beautiful Hutton book, and one of them requires for me to
> write a loop that queries a line from the user (stdin),
> looping until the user enters a valid integer (at least
> that's how I want to implement the interface to the
> exercise). I have tried tons of variants and modifications
> of code, and I can't find the way to implement this. Here is
> what my emacs buffer is at now::
>
> import Text.Read
> import System.IO
> import qualified Control.Exception as C
>
> getNum :: IO Int
> getNum = do line <- (hGetLine stdin)
> x <- (C.catch (do return (read line :: Int)) (\e -> getNum))
> return x
>
> main = do x <- getNum
> putStr ((show x) ++ "\n")
>
> Now, I've tried the Prelude's catch, the Control.Exception
> catch, I've tried moving it at the top of getnum, I've tried
> without catch, I've tried a ton of other shtuff, so much
> that I'm starting to think that Emacs is going to run out of
> electrons soon. I asked some half-newbie friends who are
> insanely enthousiastic about Haskell and they can't do it
> either (I'm starting to think that those enthousiastic
> friends are dating a beautiful girl with 3 PhDs, but she has
> a 2-inch thick green and gooey wart smack on her nose and
> they're so blindly in love that they can't admit that she
> does). I've asked some university profs and they sidetrack
> my question by saying I shouldn't do I/O so early. Can
> anyone here restore my faith in the Haskell section of
> humanity?
>
> 1. How do I catch the exception that is raised from "read"?
>
I think you want readIO, which yields a computation in the IO monad,
so it can be caught.
> 2. Where do I find the appropriate information I need in
> order to fix this? I'm probably just not searching in the
> right place. (Yes, I've seen the GHC docs, and it doesn't
> help, maybe I'm missing some background info.)
>
In this particular case, I am not sure where you'd find this
information. It's not very intuitive to a beginner why "read" doesn't
work in this case.
> 3. Please do not tell me I should solve the problem
> differently. Here is the problem I'm trying to solve, and
> nothing else:
>
> "Write a program that reads a line from the user,
> looping the query until the line contains a valid
> integer."
>
> It shouldn't be too hard i think. The best answer would be a
> two-liner code example that'll make me feel even more stupid
> than I already do.
>
> Thanks in advance.
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
More information about the Haskell-Cafe
mailing list