Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Andrew Kay <akay@sharp.co.uk>
To: caml-list@inria.fr
Subject: mutually recursive types and modules
Date: Tue, 11 May 1999 17:32:17 +0100 (BST)	[thread overview]
Message-ID: <199905111632.RAA19705@byrd.sle.sharp.co.uk> (raw)


Dear OCaml users,

We have a problem with mutually recursive types.

In our project we use a graph representation which could be reduced to:

# type node = { 
#             node_id : int;
#             mutable edges : node list;
#             ... (other fields)
# 	      }

Node_ids are generated at node creation time, and are unique, so we defined:

# type compare_nodes n1 n2 = Pervasive.compare n1.node_id n2.node_id

Then we built sets of nodes:

# module NodeSet = Set.Make(struct type t=node let compare=compare_nodes end)

So far so good.  Next we realised that we don't care about the order of
edges in the edge list, and we are always converting edge lists into sets
to do union operations and so on, so we decided to recode the node type
with edges as sets for efficiency (which is very important here).

* type node = {
*             node_id : int;
*             mutable edges : NodeSet.t;
*             ... (other fields)
* 	      }

At this point the world seemed to spin and make me dizzy, because we can't
defined NodeSet without node, and we can't define node without NodeSet.
I can't see any way to express this in OCaml.

Am I missing something obvious here?  How should I proceed?  Is this kind 
of recursion unreasonable, or just syntactically hard to express in OCaml?
Or am I merely incapable of understanding the manual?

Thanks for any help you can give.

Andrew Kay
Sharp Labs Europe Ltd, Oxford Science Park, Oxford, UK, OX4 4GB
Andrew.Kay@sharp.co.uk  Tel:+44 1865 747711 FAX:+44 1865 747717




             reply	other threads:[~1999-05-12 15:51 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1999-05-11 16:32 Andrew Kay [this message]
1999-05-12 16:55 ` Benoit deBoursetty
1999-05-12 18:04 ` Markus Mottl
1999-05-14 11:11 ` Francisco Valverde Albacete

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=199905111632.RAA19705@byrd.sle.sharp.co.uk \
    --to=akay@sharp.co.uk \
    --cc=caml-list@inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox