The problem is that when you type yand press, enter, after actually typing two characters: 'y'and a newline character, which is sent by pressing the return key. The cycle sees for the first time 'y', but the next time it sees '\n', and since it is '\n'not 'y', it completes the work.
hSetBuffering stdin NoBuffering, ( System.IO), , , , , :
continue = do
putStrLn "Do you want to continue? (y/N)"
s <- getLine
return $ s == "y"
, liftIO $ testLoop1 td : loop1, .
, testLoop1 :
testLoop1 = evalStateT loop1
evalStateT runStateT, , >> return ().