A bit counter-intuitive to the way most other languages' standard I/O libraries do it, Haskell's
isEOF does not require you to perform a read operation before checking for an EOF condition; the runtime will do it for you.
import System.IO( isEOF ) eofTest :: Int -> IO () eofTest line = do end <- isEOF if end then putStrLn $ "End-of-file reached at line " ++ show line ++ "." else do getLine eofTest $ line + 1 main :: IO () main = eofTest 1
Line #1. Line #2. Line #3.
End-of-file reached at line 4.