
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
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