caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Gabriel Scherer <gabriel.scherer@gmail.com>
To: Malcolm Matalka <mmatalka@gmail.com>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Expressing module sig and impl in mli file
Date: Tue, 18 Sep 2012 23:13:12 +0200	[thread overview]
Message-ID: <CAPFanBEJ7r4D=oGC84BRAxvH4i9k6oad4AfXTe1KEfpn0S5n3Q@mail.gmail.com> (raw)
In-Reply-To: <CAKziXDWWXFByJvT3iverWpPr6KmY-FSbr9-NBXzrAWYaubitpQ@mail.gmail.com>

From the outside, there is no point in trying to make a difference
between an "interface" and "concrete types": what users see of the
module is exactly its interface, just as what you see of a value
(through an interface boundary) is its type only. There are exotic
cases where you could want to publish a value definition (or module
implementation) through a component boundary, but that's probably not
your concern here.

So my intuitive answer (but maybe some other posters will differ) is
that, in an interface, only "module Foo : Bar" makes sense. I do not
understand why you would want the implementation to also be available.
You may be facing a problem that is different than the one you think.
Could you provide a concrete example of what you're trying to do?

Making a guess: a mistake people often make when using the OCaml
module system is to seal a module with abstract types when they
actually don't want to hide the types, but only to check that the
signature are compatible. For example, with the signature "module type
Ty = sig type t end", people will try to write "module M : Ty = struct
type t = int end" and then be surprised than "(1 : M.t)" does not
type-check. This is because "module M : Ty = <Foo>" is equivalent to
"module M = (<Foo> : Ty)" which coerces <Foo> into the signature Ty
(where "t" is abstract), and no richer. A workaround is to define
"module M = <Foo>" and then separately "module M_unused = (M : Ty)" if
you want to make sure that the interface is compatible, or to refine
it with "module M : (Ty with type t = int) = <Foo>". Not sure that is
actually your problem, though.

Finally, if you have a module implementation and are not sure what its
precise, most permissive signature is, "ocamlc -i" can help you by
printing the inferred interface.

On Tue, Sep 18, 2012 at 11:02 PM, Malcolm Matalka <mmatalka@gmail.com> wrote:
> I'm sure this question has been asked before but I didn't see it in
> the Ocaml FAQ and I'm not sure how to express it for a search.
>
> In short, how do I express the following line in a .mli file:
>
> module Foo : Bar = Baz
>
> What I want to accomplish is make present the module Foo to the user,
> where they know both the interface and the concerete types on Foo.
>
> Thanks!
>
> /Malcolm
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa-roc.inria.fr/wws/info/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>

  reply	other threads:[~2012-09-18 21:13 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-18 21:02 Malcolm Matalka
2012-09-18 21:13 ` Gabriel Scherer [this message]
2012-09-18 21:31   ` Malcolm Matalka
2012-09-18 22:40     ` Malcolm Matalka
2012-09-19  2:11       ` Edgar Friendly
2012-09-19  7:11         ` David House
2012-09-19  7:36           ` Malcolm Matalka
2012-09-19  7:49             ` David House
2012-09-19  7:51               ` David House
2012-09-19  8:00                 ` Malcolm Matalka
2012-09-19  8:11                   ` Gabriel Scherer
2012-09-19  7:25       ` Jacques Garrigue

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='CAPFanBEJ7r4D=oGC84BRAxvH4i9k6oad4AfXTe1KEfpn0S5n3Q@mail.gmail.com' \
    --to=gabriel.scherer@gmail.com \
    --cc=caml-list@inria.fr \
    --cc=mmatalka@gmail.com \
    /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).