HI Terrence,

[EMAIL PROTECTED] wrote:

I am confused on the type annotation for this function:

CopyFirst :: Int *(a e) -> *(a e) | Array a e
CopyFirst j a=:{[0]=a0} = {a & [j] = a0}

It looks like the function CopyFirst takes two arguments. The first is an integer. The second argument confuses me. The asterisk in front of (a e) means some data type which receives destructive updates.
But the syntax (a e) was not previously introduced.

And then the type restriction confuses me...

| Array a e

seems to say 'provided a and e are of type Array' ?

And then the actual code of the function confuses me... actually I think I got it

First:   CopyFirst j a=:{[0]=a0}

the function takes 2 arguments, j (an integer) and then a, an array, but it also sets a0 to the first element of the array a... of course this looks odd. Why is a0 on the RHS instead of LHS?

Then: the actual function body starts ... {a & [j] = a0} is saying 'take a and update the jth position with the value a0'
but the problem is a0 is never defined.

So, to summarize:

1 - the syntax *(a e) is used but not previously defined
See section 4.4 on page 38 of the report.
Technically arrays are a type class. This allows for instance that arrays and unboxed arrays are different types. This is the a in the (a e). The e is the type of the elements in the array (similar to the elements of a list in [e]).
The * says that this array must be unique such that it can be updated.
2 - the type restriction | Array a e is a bit confusing
This just says that the type (a e) should be an array.
3 - it seems odd that a0 is on the RHS of {[0] = a0} instead of the LHS
This notation indicates that the name a0 is assigned to the first element of the array (a.[0]). If we would do the selection on the rhs of the function, there would be two reference to the array on the rhs. This would make it too difficult for the type checker to see that the resulting array is unique.

Best,

Pieter Koopman


--
Terrence Brannon - SID W049945
1111 Polaris Pkwy, OH1-1141, Columbus, OH 43240
818-359-0893 (cell)
614-213-3426 (fax)
_______________________________________________
clean-list mailing list
[email protected]
http://mailman.science.ru.nl/mailman/listinfo/clean-list

Reply via email to