The behaviour is well defined, Haskell98 enforces a
single-writer, multiple reader locking on files (Sec.
11.3.1 of the library report) which also extends
to semi-closed handles/files.

A bug report to the maintainers of whatever produced
the reported misbehaviour would be good.

--sigbjorn

> -----Original Message-----
> From: Simon Peyton-Jones 
> Sent: Tuesday, September 05, 2000 01:10
> To: [EMAIL PROTECTED]; [EMAIL PROTECTED]
> Cc: Simon Peyton-Jones
> Subject: RE: lazy file reading in H98
> 
> 
> Folks,
> 
> Finalising the Haskell 98 report is (still) on my to-do list. 
>  I plan to
> do it after ICFP, but I need a clear week which is why I've been
> procrastinating.
> And comments do keep coming in occasionally.  Manuel's is a 
> case in point.
> 
> 
> I'd be interested to hear people's opinion about the lazy-file read
> question.  
> I'm not prepared to add new functions to Haskell 98, but I think
> the clarification of (1) or (2) below would be useful.  (2) is nice
> but it makes *all* file reading more expensive, perhaps significantly
> so (e.g. making a complete copy of the file).  So I am 
> personally inclined
> to go for (1) and require Haskell programmers to do the 
> consequent file-name
> changing themselves.   
> 
> I'm sending this message to the haskell-cafe!
> 
> Simon
> 
> | -----Original Message-----
> | From: Manuel M. T. Chakravarty [mailto:[EMAIL PROTECTED]]
> | Sent: 05 September 2000 02:10
> | To: [EMAIL PROTECTED]
> | Subject: lazy file reading in H98
> | 
> | 
> | In an assignment, in my class, we came across a lack of
> | specification of the behaviour of `Prelude.readFile' and
> | `IO.hGetContents' and IMHO also a lack of functionality.  As
> | both operations read a file lazily, subsequent writes to the
> | same file are potentially disastrous.  In this assignment,
> | the file was used to make a Haskell data structure
> | persistent over multiple runs of the program - ie, 
> | 
> |   readFile fname >>= return . read
> | 
> | at the start of the program and
> | 
> |   writeFile fname . show
> | 
> | at the end of the program.  For certain inputs, where the
> | data structure stored in the file was only partially used,
> | the file was overwritten before it was fully read.
> | 
> | H98 doesn't really specify what happens in this situation.
> | I think, there are two ways to solve that:
> | 
> | (1) At least, the definition should say that the behaviour
> |     is undefined if a program every writes to a file that it
> |     has read with `readFile' or `hGetContents' before.
> | 
> | (2) Alternatively, it could demand more sophistication from
> |     the implementation and require that upon opening of a
> |     file for writing that is currently semi-closed, the
> |     implementation has to make sure that the contents of the
> |     semi-closed file is not corrupted before it is fully
> |     read.[1]
> | 
> | In the case that solution (1) is chosen, I think, we should
> | also have something like `strictReadFile' (and
> | `hStrictGetContents') which reads the whole file before
> | proceeding to the next IO action.  Otherwise, in situations
> | like in the mentioned assignment, you have to resort to
> | reading the file character by character, which seems very
> | awkward.
> | 
> | So, overall, I think solution (2) is more elegant.
> | 
> | Cheers,
> | Manuel
> | 
> | [1] On Unix-like (POSIX?) systems, unlinking the file and
> |     then opening the writable file would be sufficient.  On
> |     certain legacy OSes, the implementation would have to
> |     read the rest of the file into memory before creating
> |     a new file under the same name.
> | 
> 

Reply via email to