caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] polymorphic variant question
@ 2001-09-21  0:14 Charles Martin
  2001-09-21  6:28 ` Francois Pottier
  2001-09-21  8:39 ` Andreas Rossberg
  0 siblings, 2 replies; 7+ messages in thread
From: Charles Martin @ 2001-09-21  0:14 UTC (permalink / raw)
  To: caml-list

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:

data.mli:
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:

a.ml:
type ('b, 'c) t = {
  data : (int, 'b, 'c) Data.t list ref;
}
               
b.ml:
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:

a.ml:
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
ref.

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
http://dailynews.yahoo.com/fc/US/Emergency_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


^ permalink raw reply	[flat|nested] 7+ messages in thread
* [Caml-list] polymorphic variant question
@ 2002-08-29 16:03 nadji
  2002-08-29 16:41 ` Dan Schmidt
  2002-08-29 17:16 ` Remi VANICAT
  0 siblings, 2 replies; 7+ messages in thread
From: nadji @ 2002-08-29 16:03 UTC (permalink / raw)
  To: caml-list

Hi all,

I am puzzled by the code below which doesn't work.

# let f = function `B -> ();;
val f : [ `B] -> unit = <fun>
# let g x = match (x:[`A|`B]) with `A -> () | y -> f y;;
Characters 51-52:
  let g x = match (x:[`A|`B]) with `A -> () | y -> f y;;
                                                     ^
This expression has type [ `A | `B] but is here used with type [ `B]
(denoting the "y" from the "f y")

How can I say to OCaml that "y" can't be of type `A ?

TIA,
Nadji

-------------------
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


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2002-08-29 19:10 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-09-21  0:14 [Caml-list] polymorphic variant question Charles Martin
2001-09-21  6:28 ` Francois Pottier
2001-09-21  8:39 ` Andreas Rossberg
2002-08-29 16:03 nadji
2002-08-29 16:41 ` Dan Schmidt
2002-08-29 17:16 ` Remi VANICAT
2002-08-29 19:05   ` nadji

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).