[m-dev.] stream typeclasses (again)

Julien Fischer juliensf at cs.mu.OZ.AU
Sun Mar 19 16:28:02 AEDT 2006


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.

> 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.

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