Mutability idea retracted
30 May 2012
I have been thinking a bit more about the approach to mutability I recently discussed. It seemed a bit too good to be true (too clean) and I think I’ve realized a problem.
The problem derives from my definition of types:
T = Q U
Q = mut | const | imm
U = [T]
| @T
| &T
| { (f : T)* }
| X
| int
| uint
| ...
The interesting case is that of a type variable, denoted as X. I
grouped type variables under the heading of “unqualified types”. But
this is of course incorrect, they are not unqualified types. They can
map to a qualified type (in fact, that’s the whole point of this
exercise). So really the hierarchy ought to be:
T = Q U
| X
Q = mut | const | imm
U = [T]
| @T
| &T
| { (f : T)* }
| int
| uint
| ...
Now, the problem with this is that the meaning of a function definition like this is unclear:
fn set<A>(x: [mut A], i: uint, y: A) { x[i] = y; }
In fact, this definition does not fit the type grammar I gave. This
is because A is a T but in the type [mut A] it appears where a
U is expected. The same scenario kind of crops up with local
variables. But I think we would like to be able to write a function
like set() (although an alternative might be to make a mut kind
and write <A:mut>). It’s not obvious to me if the situation can be
salvaged.