English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
[Caml-list] polymorphic variant question
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2001-09-21 (00:14)
From: Charles Martin <joelisp@y...>
Subject: [Caml-list] polymorphic variant question
I have a number of modules A, B, C that share a single data structure
between them, all under the control of a central module.  Each wants to
store different kinds of data in the data structure.  I can create a
variant type to classify the data by module:

type ('a, 'b, 'c) t = A of 'a | B of 'b | C of 'c

So each of the individual modules then has code that looks like this:

type ('b, 'c) t = {
  data : (int, 'b, 'c) Data.t list ref;
type ('a, 'c) t = {
  data : ('a, string, 'c) Data.t list ref;

Then the central module can have code like this:

  let data = ref [] in
  let a = { A.data = data } in
  let b = { B.data = data } in
  let c = { C.data = data } in

The trouble with this approach is that every time I add a new module, I
must add a new tag to the classify data type, and update all of my
signatures and type declarations in modules A, B, C, etc.  This seems wrong
since the whole point is to separate these abstractions.

I am hoping I can use polymorphic variants to escape this trap.  Thus, the
code for an individual module would look like this:

type t = {
  data : [`A of int] list ref;

Of course, then in the central module the type [`A of a_data] list ref
conflicts with the type [`B of b_data] list ref and [`C of c_data] list

What I want is for each of modules A, B, and C to have type annotations
such as

     data : [> `A of a_data ] list ref

so that the other modules could add their tags, but this of course is an
unbound type parameter.

I have the feeling this is a very standard OCaml design pattern, and I'm
just missing something obvious... can someone lend a hand?  Thanks.

Terrorist Attacks on U.S. - How can you help?
Donate cash, emergency relief information
Bug reports: http://caml.inria.fr/bin/caml-bugs  FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr  Archives: http://caml.inria.fr