[m-dev.] stream typeclasses (again)
Julien Fischer
juliensf at cs.mu.OZ.AU
Sun Mar 19 23:40:34 AEDT 2006
On Sun, 19 Mar 2006, Ian MacLarty wrote:
> On 3/19/06, Julien Fischer <juliensf at cs.mu.oz.au> wrote:
> >
> > On Sun, 19 Mar 2006, Ian MacLarty wrote:
> >
> > > On Wed, Mar 08, 2006 at 03:03:52PM +1100, Julien Fischer wrote:
> > > >
> > > > Are you reasonably satisified with the rest of the design as it stands?
> > > >
> > >
> > > Not really. I'm a bit dissapointed I couldn't implement the rot13
> > > example the way I wanted, because of the current restrictions on
> > > instance declarations. It seems that making the state and the stream
> > > arguments polymorphic is going to be more trouble than it's worth (at
> > > least with the current type and mode systems).
> > >
> > > What do you think about doing one of the following:
> > >
> > > 1. Make the state updated by a stream always be io.state. The only
> > > example I could think of where it wouldn't be an io.state is with
> > > string buffers, but then you showed it's probably better to use the
> > > io.state anyway.
> >
> > That's pretty much what extras/streams does now.
> >
>
> No it isn't. You still have the Unit argument which is the main
> difference between this proposal and that one. The Unit argument
> allows you to write different types of things to the stream (strings,
> chars, ints etc) without having to define seperate methods for each
> type of thing you want to be able to write to (read from) the stream.
>
I meant with respect to the state that is updated - I know it differs
with the Unit argument.
> > > 2. Do away with the Stream argument and just have a di, uo pair of polymorphic
> > > states. Something like:
> > >
> > > :- typeclass stream.input(Unit, State) where [
> > > pred get(Unit::out, State::di, State::uo) is det
> > > ].
> > >
> > > File streams could be implemented by embedding the IO state, together
> > > with the file handle and name in the State type.
> > >
> > > We'd also then be able to define forwarding streams like my version
> > > of rot13 nicely:
> > >
> > > :- type encryption_stream_state(S)
> > > ---> encryption_stream_state(
> > > stream_state_to_forward_to :: S,
> > > internal_encryption_state :: ...
> > > ).
> > >
> > > :- instance stream.output(string, encryption_stream_state(S)).
> > >
> > > This instance declaration conforms to the current restrictions.
> > >
> > > With such a scheme we could also ensure that closed streams are never
> > > used, by clobbering the stream when it's closed.
> > >
> > > Do you think the mode system is up to the task? I don't see why it
> > > wouldn't be, since it handles di, uo pairs for IO just fine.
> >
> > I think that embedding the I/O state inside anything tends to lead to
> > highly confusing code; it's something I would prefer to avoid.
> >
>
> Ralph makes a good point too. Let's go with the first approach, i.e:
>
> :- typeclass input(Stream, Unit) where [
> pred get(Stream::in, Unit::out, io::di, io::uo) is det
> ].
>
Ok. I'll take a look at it in the next couple of days (if you don't
get there before me). BTW, I've almost finished a change that fixes
the problems with file streams in the io module overlapping when used
in typeclass instances.
Julien.
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to: mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions: mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------
More information about the developers
mailing list