Hi,

Your code does not work because sequence function can't be lazy due to the strictness of IO monad's >>= operation.

Here's a more verbose version:

readWhile :: (String -> Bool) -> IO [String]
readWhile p = do
  line <- getLine
  if p line
    then do
      lines <- readWhile p
      return $ line : lines
    else
      return []

ghci> readWhile (/="")
foo
bar

["foo","bar"]


On Sun, Mar 6, 2016 at 7:38 PM, Nicolaas du Preez <njdupreez@yahoo.com> wrote:
Good day All,

Why does

    liftM (take 5) $ sequence $ repeat getLine

not stop at reading only 5 lines from stdin but keeps on reading more?

What I’m really trying to achieve is to get input from the user until
an empty line is read with the code below.  But this doesn’t work 
as I expected, similar to the above.

    liftM (takeWhile (/= "")) $ sequence $ repeat getLine


Regards,
Nicolaas du Preez

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners