*safe* coerce, for regular and existential types

oleg@pobox.com oleg@pobox.com
Sat, 2 Aug 2003 01:46:55 -0700 (PDT)


> Does this technique extend to polymophic types?
Yes, of course. The type F a b in the earlier message was polymorphic.

> Let's say we have the following type:

> > data D a = C | D a

> Is it possible to index the type D a?

I have just lifted the polymorphic Maybe -- which is isomorphic to
your type. 
	ti maybe_decon (Just True)
	ti maybe_decon (Just 'a')
give different results. (ti maybe_decon Nothing) can give either the
same or different indices for different concrete types of
Nothing. It's all up to you. For each new datatype, the user has to
provide two functions: one to deconstruct the datatype into a
polymorphic array of values of already indexable types, and the other
is to re-construct the datatype from the array. As long as the user
can do that -- in _any_ way he wishes -- the mapping is
established. Incidentally, there is no need to add any new type
instances or add new alternatives to datatype declarations. There is
no need to extend the type heap either.

I could post the code but I need to write explanations and perhaps
change a few identifier names to something more meaningful. Alas, it's
already almost 2am, and I want to go home...