[Haskell-cafe] Re: Silly I/O question

John Goerzen jgoerzen at complete.org
Tue Sep 28 17:19:44 EDT 2004


On 2004-09-28, Peter Simons <simons at cryp.to> wrote:
> John Goerzen writes:
>
> > That failed, though, because getContents closes the file
> > after it's been completely read (ugh -- why?).
>
> You could read the contents once, write it to a temporary
> file, and then copy it multiple times from there. Then you
> could do it in blocks. But that's probably not what you want
> to do.

That just moves the problem :-)  If I assume that stdin is redirected,
it is seekable, and I could do the same there.  But the block I/O in
Haskell makes no sense to me (how do I allocate a Ptr type block
thingy)?

> > But I couldn't figure out a way to make this either
> > properly tail-recursive while handling the exception, or
> > to avoid polling for EOF each time through the function.
>
> You might want to write a function that copies the file
> _once_ and then just call that function several times. Like
> in the examples above. I don't think you need explicit
> recursion at all.

If I load it into memory, yes.  Otherwise, it seems not so easy.

> Hope this is helpful.

Yes, thanks for the insight.

FWIW, this is working for me:

import IO

main = disp 100

disp 0 = return ()
disp n =
    let copy x = do
               eof <- isEOF
               if eof
                  then return ()
                  else do
                       line <- getLine
                       putStrLn line
                       (copy 0)
        in do
           copy 0
           hSeek stdin AbsoluteSeek 0
           disp (n-1)

but it seems wasteful to poll isEOF so much.

-- John




More information about the Haskell-Cafe mailing list