[clean-list] uniqueness attributes of data constructors

Wolfgang Jeltsch wolfgang at jeltsch.net
Mon Aug 22 11:45:18 MEST 2005


Am Montag, 22. August 2005 10:24 schrieben Sie:
> On Sun, 21 Aug 2005, Wolfgang Jeltsch wrote:
> > Hello,
> >
> > in the following mail I use the notation ^*, ^x and ^u/^v for uniqueness
> > attributes "unique", "non-unique" and "variable".
> >
> > I declare a type T via this declaration:
> > 	:: T a = C (T a -> a)
> >
> > The type of C is (T^u a^v -> a^v) -> T^u a^v.  This can be specialized to
> > the following types:
> >
> > 	1. (T^* a^v -> a^v) -> T^* a^v
> >
> > 	2. (T^x a^v -> a^v) -> T^x a^v
> >
> > Further, I have a function f with type T^* a^v -> a^v.
>
> It seams to me that 2. is not a legal type. I would expect an
> uniqueness-attribute-equation [u<=v] added to types like T^u a^v ->
> a^v (where ^*<=^*, ^*<=^x, and ^x<=^x).
>
> Or in Clean notation: u:(T v:a) [u<=v].
> This makes (T a), *(T a), and *(T *a) legal, but (T *a) illegal.

I see no reason why uniqueness propagation should introduce the inequality
u <= v.  For a type like List the presence of such an inequality would be 
right.  List is declared as follows:

	:: List a = Nil | Cons a (List a)

Values of type a (the element type) may be components of a list since they 
appear as arguments of a data constructor (Cons).  However, with the type 
constructor T and its data constructor C, this isn't the case.  C doesn't 
have an argument of type a.  C is applied to a function, so if this 
function's uniqueness attribute is *, the uniqueness attribute of T a has to 
be *.  Yes, the type of C I mentioned was too loose but considering what I've 
just said, C's type should be this:

	w:(u:(T v:a) -> v:a) -> u:(T v:a) [u <= w]

(I hope, I got the Clean syntax right.)  The difference to your proposal is 
that there is no inequality u <= v but an inequality u <= w.  But since 
u <= x for all attributes u, w could be instantiated with x ("non-unique") so 
that my approach for fooling the type system (see below) would still be 
possible.

Apart from this, even if your inequality u <= v is right, my approach of doing 
this dangerous type conversion for f would still work, wouldn't it?  You 
would just have to replace v by x ("non-unique").  The key point of my 
approach is to modify the attribute of T a.  The attribute of the type 
variable a doesn't matter and can be whatever fits.

> > Now, I apply C to f which results in a value of type T^* a^v according to
> > the first of the above specializations.  I duplicate the reference to the
> > funtion application C f which results in the function application having
> > type T^x a^v.
>
> This should yield T^x a^x, I don't know why it doesn't. Are you sure you
> did not overlook something. I don't understand why you describe types with
> multiple uniqueness-attributes without equations between those attributes.

The reason was that I thought that there were no constraints on the attribute 
variables in this example.

> > Now, I use pattern matching to extract f.  The extracted function
> > has type T^x a^v -> a^v according to the second of the above
> > specializations.
> >
> > But T^* a^v -> a^v is not a subtype of T^x a^v -> a^v.  In fact, it's the
> > other way round.  I could apply the extracted function f to a value of
> > non-unique type which shouldn't be possible according to f's original
> > type.
> >
> > Since I cannot imagine that there is a notable flaw in the uniqueness
> > type system, I wonder where my mistake is.  Can somebody explain this to
> > me?

> [...]

Best regards,
Wolfgang


More information about the clean-list mailing list