
You have the idea. The x is fetched with getChar, then it sits in
that context until the return is executed.
So the x is sitting there and getLine' is called. It makes its own x
via getChar, then maybe getLine' is called again. Each getLine' sits
there with its own version of x until finally the last getLine' get's
a \n, and then returns a []. Then the whole thing unwinds by
prepending x to [], then x to [x], then another x to [x,x], until
there are no more x's to return, and you have the whole string.
Hopefully that paragraph makes sense.
On Tue, Jan 7, 2014 at 11:54 AM, Angus Comber
Before looking at getLine, I can understand this:
getnumber :: IO Int getnumber = do x <- getChar if isDigit x then return (ord x - ord '0') else return 0
OK, it is not a very useful function but at least I understand it. return is required so that the function returns an IO Int.
But I don't understand this:
getLine' :: IO String getLine' = do x <- getChar if x == '\n' then return [] else do xs <- getLine' return (x:xs)
I can understand what will happen if a user enters a newline (only). return [] brings the empty list into the monadic world.
But what is happening if x is not a newline?
xs <- getLine' will recursively call getChar and retrieve another character from the input stream. But it will do this BEFORE the return (x:xs) - so what is happening to all the head elements in the list - the x element?
It is difficult to picture in my mind how this is working. I understand recursion but this looks tricky.
Can someone help me work this out?
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners