POSSREPs as union types
Date: Sat, 29 Aug 2009 23:07:33 -0700 (PDT)
I had a though about possreps the other day, and I wanted to post it, for no particular reason. This thought is not much developed, so don't expect much. :-)
It occurred to me that possreps have a lot in common with union types. Briefly, a disjoint union is a language construct that permits a type to consist of disjoint sets of values, each disjoint set having its own named constructor and constructor arguments.
For example, one could define a binary tree of ints as follows:
type tree = leaf int | branch tree tree;
Meaning a tree is either a leaf with an associated int, or a branch with a left (sub)tree and right (sub)tree.
Suppose one were to give names to the attributes of the constructors:
type tree = leaf value:int | branch left:tree right:tree;
No big deal.
Suppose I use the classic possrep example, a point with polar or rectangular coordinates.
type point = polar r:real theta:real | rectangular x:real y:real;
Now suppose I add to the type enough information to describe the bijection between the two constructors:
type point = polar r:real theta:real | rectangular x:real y:real
where x = r * cos(theta), y = r * sin(theta);
(Please allow me to be all handwavey about the r=0 case
so as to focus on the big picture.)
I think that's roughly enough information to be able to do all the necessary work.
This makes possreps and union types look quite similar
to me. It also gives a clear idea of how to differentiate
between "member functions" that ought to belong
("directly" if you will) to the type, and those that are
less immediately associated: whether or not they are constructor arguments.
Is it necessary that there always be a bijection between multiple possreps for a type? If not, how does one convert between them?
Marshall Received on Sun Aug 30 2009 - 08:07:33 CEST