[m-dev.] dummy types with user-defined equality/comparison

Ian MacLarty maclarty at cs.mu.OZ.AU
Mon Jun 5 16:36:17 AEST 2006


On Mon, Jun 05, 2006 at 04:07:44PM +1000, Mark Brown wrote:
> On 05-Jun-2006, Ian MacLarty <maclarty at cs.mu.OZ.AU> wrote:
> > On Tue, May 30, 2006 at 03:25:31PM +1000, Mark Brown wrote:
> > > On 29-May-2006, maclarty at cs.mu.OZ.AU <maclarty at cs.mu.OZ.AU> wrote:
> > > > On Mon, May 29, 2006 at 05:09:09PM +1000, Julien Fischer wrote:
> > > > > 
> > > > > Currently the compiler will abort when confronted with a dummy type that has
> > > > > user-defined equality or comparison.  Below are two proposals for fixing
> > > > > this.  Which do people prefer?
> > > > > 
> > > > > (1) Change the reference manual to say that discriminated union types
> > > > >     whose body consists of a single zero-arity constructor may not have
> > > > >     user-defined equality or comparison defined upon them.  (Plus change
> > > > >     the compiler to emit the appropriate error mesages.)
> > > > > 
> > > > 
> > > > I think this option is best, since if values of the type are restricted
> > > > to one zero-arity function symbol then any two values of the type must
> > > > compare as equal for all sound definitions of equality and comparison.
> > > 
> > > I agree that this option is best.
> > > 
> > > Note, however, that our intended interpretation of dummy types is not
> > > meant to be reflected in the value given by the type declaration.  For
> > > example, if the io.state type were defined as a dummy type then the
> > > intent is that there are many different (i.e., not equal) values.  If
> > > the compiler was allowed to reason that there is only one possible state
> > > of the world, then it could in theory infer that main/2 means that same
> > > as '='/2.  :-(
> > > 
> > > I don't think it's urgent that we do anything about this, though.  For the
> > > way that dummy types like io and store are used, it is the unique inst which
> > > gives the important information, not the type.
> > 
> > I think this is a very good point.  I also think the problem is more
> > serious than Mark makes out.
> > 
> > As I understand it the common usage of dummy types would be to thread a
> > pair of abstract values through predicates that update some state via
> > side effects.  The dummy arguments allow us to make the predicate pure.
> > The problem is that anyone looking at the code who applies declarative
> > reasoning will rightfully come to the conclusion that the predicate can
> > never update the dummy value, since they can see that it is a unit type.  
> > We thus cannot reason declaratively about predicates with dummy
> > arguments as they are currently defined.  What's worse is there is
> > usually no impurity annotation on these predicates to alert us to the
> > fact that we can't reason about them declaratively.
> > 
> > The fact that the compiler doesn't reason that predicates that only
> > update their dummy arguments are the same as =/2 is not important.
> > The issue is that a human reader may do so.
> 
> There is the final inst of `dead' which they should also consider.  But I
> take your point.
> 
> > 
> > I think the problem comes from the fact that dummy types are transparent
> > when they should be opaque.
> 
> "Opaque" is a good word.  How about:
> 
> 	:- opaque type foo ---> foo.
> 
> as a declaration?
> 

Or just:

:- opaque type foo.

Since it's a dummy type there's no need to actually define foo (indeed
it wouldn't be opaque any more if you did :-)

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