From: "Ryan Tarpine" <rtarpine@hotmail.com>
> Thank you; that was the explanation I was waiting for! My next question is
> whether or not there is some non-typesafe route around this. Could I use
> Obj.magic to store different data types in one field, as long as I keep
> track of what type is really there (e.g., have a second field that would
> store a number representing the type) so I can cast back later? Sorry if I
> keep finding myself longing for the "void*" C-ism!
A well known solution to this problem is to use exceptions to hold
values.
exception A of int
exception B of bool
All exceptions define a different constructor, and they are all of
type exn.
But you might rather want to analyze why you want such a behaviour.
Why do you need to store such a versatile data? Note that you can use
polymorphic variants to handle extensible datatypes, as long as you
are writing in a purely functional way. And even without using this
kind of polymorphism, ML datatypes allow you to easily (and safely)
handle unions (sums), so that the idiom you're looking for can be
avoided. If you need parameterization, you can also look for
parametric types and/or functors.
I cannot give you an universal solution, because it depends very much
of your concrete goal. But trying to dodge the problem is probably not
the right way to go.
Jacques Garrigue
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners