From: Jean-Christophe Filliatre <Jean-Christophe.Filliatre@lri.fr>
To: andrew@acooke.org
Cc: "ocaml list" <caml-list@inria.fr>
Subject: Re: [Caml-list] Newbie: Separate compilation of interfaces, modules
Date: Tue, 2 Mar 2004 10:30:45 +0100 [thread overview]
Message-ID: <16452.21573.57928.3506@gargle.gargle.HOWL> (raw)
In-Reply-To: <56125.139.229.3.218.1077971452.squirrel@localhost>
andrew cooke writes:
>
> I can't work out how to structure the following in files (there are
> examples in the documentation, but all seem to be for interactive work).
> I don't know if the problem is conceptual (not understanding modules,
> signatures etc) or practical (don't know what to type).
>
> I have an interface, PersistentArray, that I define in PersistentArray.mli
>
> Then I have an implementation, BinaryTreeArray, that I code in BinaryTree.ml
>
> But where do I put the information that BinaryTreeArray implements
> PersistentArray? What should go in BinaryTreeArray.mli so that I can use
> it as a particular implementation of PersistentArray?
In ocaml, files define modules and signatures with the following
convention: code in file a.ml defines a module A and code in file
a.mli defines the signature for this module (The ocaml compiler checks
that a.ml has indeed the signature declared in a.mli).
In a simple situation with only one implementation, the interface for
your module BinaryTreeArray should go in file BinaryTreeArray.mli (or,
symmetrically, the code in BinaryTreeArray.ml should go instead in
PersistentArray.ml to have signature PersistentArray.mli).
Since you are willing to reuse a single interface for several
implementations, this simple schema one-file-one-module does not suit.
You need to *name* your PersistentArray signature; for this purpose,
you can for instance create a file sig.mli containing its definition:
sig.mli:
module type PersistentArray = sig
...
end
Then you can define several implementations with this signature:
module BinaryTreeArray : Sig.PersistentArray = struct
...
end
module TrieArray : Sig.PersistentArray = struct
...
end
> The idea is that later I can define some other implementation, say
> TrieArray, that can be used as the PersistentArray implementation without
> changing any more code than is necessary (preferably just one line
> somewhere).
There are several ways to do this:
1. give a name to the implementation of your choice
module PA = BinaryTreeArray
and use PA in the following. Then switching to another
implementation only requires to change the first line.
2. write your code as a functor
module F(PA : Sig.PersistentArray) = struct ... end
and then only the functor instanciation will change:
module M = F(BinaryTreeArray)
Hope this helps,
--
Jean-Christophe
-------------------
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
prev parent reply other threads:[~2004-03-02 9:43 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-02-28 12:30 andrew cooke
2004-02-28 13:04 ` To beginners list " andrew cooke
2004-03-02 9:30 ` Jean-Christophe Filliatre [this message]
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=16452.21573.57928.3506@gargle.gargle.HOWL \
--to=jean-christophe.filliatre@lri.fr \
--cc=andrew@acooke.org \
--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