すまん。インデントがずれてしまった、、、


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)