main = do h <- openFile "test.log" ReadMode hGetLinesTail h 10 0 >>= putStrLn hClose h
blockSize = 128 hGetLinesTail h l pos = do xs <- hGetContentsSeekFromEnd h pos if l > (length$lines xs) then hGetLinesTail h l (pos + blockSize) else return xs
hGetContentsSeekFromEnd h pos = do hSeek h SeekFromEnd (-pos) replicateM (fromInteger pos) (hGetChar h)