[Haskell-beginners] Picking apart getLine

Angus Comber anguscomber at gmail.com
Tue Jan 7 16:54:15 UTC 2014

Before looking at getLine, I can understand this:

getnumber :: IO Int
getnumber = do x <- getChar
               if isDigit x then
                     return (ord x - ord '0')
                     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 []
                         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?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20140107/b8c21697/attachment.html>

More information about the Beginners mailing list