[m-dev.] feature request: allow `with_type` and `with_inst` in type and inst definitions

Mark Brown mark at csse.unimelb.edu.au
Tue Mar 6 19:21:14 AEDT 2007


On 06-Mar-2007, Ondrej Bojar <bojar at csse.unimelb.edu.au> wrote:
> Mark Brown wrote:
> >>:- pred mypred(myextraarg::in)
> >>    `with_type` folding_predicate(T)
> >>    `with_inst` folding_predicate.
> >>
> >>It would be quite useful to allow the annotations in type and inst 
> >>definitions, too:
> >>
> >>:- type extra_folding_predicate(Extra, T)
> >>    == (pred(Extra) `with_type` folding_predicate(T)).
> >
> >This isn't using "with type" in the same sense as above.  X `with_type` T
> >means (loosely) that the type of X is T, but that doesn't hold in this 
> >case.
> 
> I'm not sure I see your point. For both cases, I think
> 
> X:   a predicate
> T:   type of the predicate's arguments (i.e. higher level type of the 
> predicate)
> 
> What is maybe confusing is the "with" in the annotation functor?
> 
> Or maybe you read the declarations this way:
> 
> >>:- pred mypred(myextraarg::in)
> >>     `with_type` folding_predicate(T)
> >>     `with_inst` folding_predicate.
> 
> Declare a predicate mypred to have the type (myextraarg + args of 
> folding_predicate(T).

I read it as "terms of the form mypred(E), where E has type myextraarg,
will have type folding_predicate(T)".

> 
> While here you read:
> 
> >>:- type extra_folding_predicate(Extra, T)
> >>     == (pred(Extra) `with_type` folding_predicate(T)).
> 
> Declare a type extra_folding_predicate(Extra, T) to be
> *the type of* predicate with args (Extra+args of folding_predicate(T)).
> ...and you're missing the *the type of* in the formal version of the 
> declaration.

No, I just don't think that `with_type' means the same as `+'.

I read this as:
	- the two sides of `==' are the same type, and
	- the right hand side, because of the annotation, has type
	  folding_predicate(T).

The difference between the two declarations is that in the pred declaration,
the thing whose type is being defined (namely, the identifier mypred) is
_inside_ the left hand side of the with_type term, but in the type
declaration it is _outside_ the with_type term.  That's why the same pattern
works in the first case but not the second.

> 
> Well, you're right that these are different, so maybe something like 
> `and_append` should be used in the second case instead of `with_type`.

Something like this would make more sense:

:- type extra_folding_predicate(Extra, T) `apply` Extra
	== folding_predicate(T).

That is, a term of type extra_folding_predicate(Extra, T) that has an
argument of type Extra will have type folding_predicate(T).  We would
require that all type variables to the right of `apply` also appear to
the left of it.

I wouldn't have any objection to allowing type declarations of this form.

Cheers,
Mark.

--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to:       mercury-developers at csse.unimelb.edu.au
Administrative Queries: owner-mercury-developers at csse.unimelb.edu.au
Subscriptions:          mercury-developers-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the developers mailing list