[Haskell] line-based interactive program

Wolfgang Jeltsch wolfgang at jeltsch.net
Thu Jul 14 07:38:41 EDT 2005

Am Donnerstag, 14. Juli 2005 13:17 schrieben Sie:
> [...]

> > > where readEntireFile reads the entire file and returns it as a string.
> > > I can imagine several results: [a,a], [a,b], [a,_|_], [_|_,_|_], _|_.
> >
> >I decided to distinguish between read-only I/O and write-permitted I/O. 
> > If readEntireFile is declared as read-only I/O (which would be sensible)
> > then the above code would return ['a','a'] since multiple read-only
> > actions are allowed at the same time.
> ['a','a'] is a good result in case of multiple readers. But how do you
> distinguish between read-only I/O and write-permitted I/O? In your example
> you introduced:
> >     readChar :: FileIO Char
> >     writeChar :: Char -> FileIO ()
> Both belong to the FileIO monad. This also relates to the question at the
> bottom of the previous e-mail.

FileIO was the type from a previous approach where I didn't intend to 
distinguish between write-permitted and read-only I/O.  The read-only thing 
which I mentioned later in my mail was an enhancement to this approach where 
write-permitted and read-only actions use different types.

> [...]

> Here you introduce a FileReadIO monad. Is this the way you intend to
> distinguish between read-only actions and write-permitted actions? That
> seems okay.

Yes, FileReadIO denotes read-only actions whereas write-permitted actions are 
denoted by a different monad.

> Minor detail: you use readChar :: FileIO Char within FileReadIO monad. That
> won't type check.

In the advanced approach, readChar would have type FileReadIO Char.

> [...]

Best wishes,
Wolfgang Jeltsch

More information about the Haskell mailing list