caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Neel Krishnaswami <neelk@alum.mit.edu>
To: caml-list@inria.fr
Subject: Re: [Caml-list] Yelling
Date: Wed, 23 Apr 2003 10:56:51 -0400	[thread overview]
Message-ID: <16038.43443.192953.705022@h00045a4799d6.ne.client2.attbi.com> (raw)
In-Reply-To: <200304231716.23923.exa@kablonet.com.tr>

Eray Ozkural writes:
> 
> BTW, does somebody have a good idea of how to make one module
> inherit from another? Say, for implementing Graph using
> Digraph. It's too bad there isn't an Ada like package extension
> mechanism.

You can pretty easily simulate the effect of this kind of inheritance
using the module system, but it's a moderate pain.

First, I'll talk about module signatures. Signatures have a structural
subtyping relationship -- signature BAR is a subtype of FOO if it
supports all of FOO's interface. It is permitted to offer more
operations, but must include all of FOO's types and values. Then you
can use a module of signature BAR wherever a FOO is expected. Here's
an example:

  module type FOO =
    sig
      type t
      val v : t
    end
  
  module type BAR = (* This is a subtype of FOO *)
    sig
      type t
      val v : t
      val v' : t
    end

Notice that there's no syntax to abbreviate the definition of BAR; you
need to manually include all of the types and operations in it. This
will be your main annoyance, but for a closed library it's tolerable.

Happily, there is syntax to abbreviate the *implementation* of module
extensions. You can implement one module, and then use the include
keyword to add its types and bindings to some other module. For
example:
  
  module Foo : FOO =
    struct
      type t = Foo of unit
  
      let v = Foo()
    end
  
  module Bar : BAR with type t = Foo.t =
    struct
      include Foo (* Add the type t and value v to the Foo module *)
  
      let v' = v
    end

The "with type t = Foo.t" thing at the top of Bar is a sharing
declaration. It informs the compiler that the type Bar.t is the same
as the type Foo.t, so you can freely intermix Foo.t and Bar.t values.
(Otherwise the compiler would forbid it, on the grounds that these are
two different abstract types.)

I hope this helps! 

-- 
Neel Krishnaswami
neelk@alum.mit.edu

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


  reply	other threads:[~2003-04-23 14:52 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-04-23 14:16 Eray Ozkural
2003-04-23 14:56 ` Neel Krishnaswami [this message]
     [not found]   ` <3EA6AB00.7020305@post.tepkom.ru>
2003-04-23 15:31     ` Neel Krishnaswami
2003-04-23 15:50       ` Eray Ozkural
2003-04-24  7:58       ` Hendrik Tews
2003-04-23 15:33   ` Andreas Rossberg
2003-04-23 15:56   ` Eray Ozkural

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=16038.43443.192953.705022@h00045a4799d6.ne.client2.attbi.com \
    --to=neelk@alum.mit.edu \
    --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;
as well as URLs for NNTP newsgroup(s).