Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Alain Frisch <alain.frisch@lexifi.com>
To: yminsky@gmail.com
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] A limitation of "with type" declarations for first-class modules
Date: Tue, 20 Sep 2011 11:03:42 +0200	[thread overview]
Message-ID: <4E7856EE.3050903@lexifi.com> (raw)
In-Reply-To: <CADKNfhL2eqV3aSF76yy6rigPVfj+MXhjzh_b_xizbwdt3P_QZg@mail.gmail.com>

On 09/20/2011 03:36 AM, Yaron Minsky wrote:
> For some reason, 1st-class modules have more restrictive "with" syntax,
> which turns out to be a practical problem.
>
> The main constraint is that with constraints do not seem to be able to
> refer to sub-modules.  Consider the following code snippet:
>
>>      module type Foo = sig type t end
>>      module type Bar = sig module Foo : Foo end
>>
>>      (* compiles *)
>>      let g (type a) (m : (module Foo with type t = a)) = ()
>>
>>      (* fails to compile with a syntax error *)
>>      let f (type a) (m : (module Bar with type Foo.t = a)) = ()
>
> Of course, ordinary modules have no such constraint.  Any thoughts as to
> what is going on here, and whether it can be fixed?

The important point is that package types (the ... in a type expression 
(module ...) or in an expression (module M : ...)) are not module types. 
Syntactically, they are indeed a subset of module types, but it is a 
strict subset, and they obey different rules than module types.

Package types live at the boundary between types and module types. In a 
packing expression (module M : ...), the package type must produce a 
well-typed module type. This is why you cannot write (module M : S with 
type t = 'a), because "S with type t = 'a" is not a proper module type. 
But (module S with type t = 'a) is a correct type.

Package types must also support all operations on types, including 
equality, unification, etc.  For instance, unifying (module S1 with type 
t = 'a) and (module S2 with type t = 'b) is defined as checking than S1 
and S2 are equivalent paths and unifying 'a and 'b. The fact that a 
package type can also be seen as a module type is nowhere used in this 
definition. (Of course, one must be careful when defining equality of 
package types that it does not allow to cast a module from one module 
type to an incompatible one.)

There is some flexibility in both the definition of admissible package 
types and the definition of equality between package types.

For instance, I don't see any problem or difficulty in your proposal of 
allowing constraints on types nested in sub-modules (but this should be 
checked carefully). Feel free to open a feature request for this! 
Similarly, one could allow "with type t :=" constraints in addition to 
"with type t =".  Is there a need for that?  One could also relax 
equality of package types (module S1 with ...) and (module S2 with ...) 
by checking that S1 and S2 expand to structurally equivalent module 
types (with the exact same ordering between value components!).



-- Alain

  parent reply	other threads:[~2011-09-20  9:03 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-20  1:36 Yaron Minsky
2011-09-20  8:00 ` Jacques Le Normand
2011-09-20  8:10   ` Yaron Minsky
2011-09-20  9:03 ` Alain Frisch [this message]
2011-09-20  9:23   ` Jacques Le Normand
2011-09-20 10:07   ` Yaron Minsky
2011-09-20 10:13     ` Yaron Minsky

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=4E7856EE.3050903@lexifi.com \
    --to=alain.frisch@lexifi.com \
    --cc=caml-list@inria.fr \
    --cc=yminsky@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