From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail1-relais-roc.national.inria.fr (mail1-relais-roc.national.inria.fr [192.134.164.82]) by walapai.inria.fr (8.13.6/8.13.6) with ESMTP id p49HMmWE005551 for ; Mon, 9 May 2011 19:22:48 +0200 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq8CAOAhyE3RVdU2imdsb2JhbACXYo4XCBQBAQEKCQ0HEgYhqkSMGYIxhH42iF8BAQMGhgYEj2WIQIIxO4NN X-IronPort-AV: E=Sophos;i="4.64,341,1301868000"; d="scan'208";a="107917234" Received: from mail-yw0-f54.google.com ([209.85.213.54]) by mail1-smtp-roc.national.inria.fr with ESMTP/TLS/RC4-SHA; 09 May 2011 19:22:42 +0200 Received: by ywf7 with SMTP id 7so3092482ywf.27 for ; Mon, 09 May 2011 10:21:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=EAe9K+3Ra8WdhsQ63++j40BwzoOUQxFf1Qr2gX6CG4o=; b=CU2qdP4PMi+EZOJuET1NHabdexcd/RszrxPv9VkLadKKAD9UT5VEP31kA5h28nrWmH 7DJA13rljf7151pVbvIGl8kCSnuI9SvPazMTIwDt8v02ccneXWyfHqL/7udknIg6E4pF nYTeLfkHiRHDLcOXJVxV0V+Df8rHldIvDuqGk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=L/r5UdEFOODNSPOGTV34ThGCEYBN9GmvXIDVAXZ2T3VUqqWGHzs6qX8Q4+/0rNTvg8 1sMA7S/EYiDm/ER7xK2pYU6wDEtgeS5nTl89R4FdkSE4/MGek1W+NZ39WVp6Bcxpleve QbP7Do2ic3QVAyYlkBHGjgGkS81F0QDAsni8I= MIME-Version: 1.0 Received: by 10.151.79.16 with SMTP id g16mr5588628ybl.404.1304961712514; Mon, 09 May 2011 10:21:52 -0700 (PDT) Received: by 10.147.178.15 with HTTP; Mon, 9 May 2011 10:21:52 -0700 (PDT) In-Reply-To: References: <20110509142702.GZ28842@janestreet.com> Date: Mon, 9 May 2011 13:21:52 -0400 Message-ID: From: Markus Mottl To: yminsky@gmail.com Cc: caml-list@inria.fr Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by walapai.inria.fr id p49HMmWE005551 Subject: Re: [Caml-list] "with module" surprises I think the example you gave correctly fails, because you are trying to specialize a non-existent type rather than augment an existing module signature. The name of the type / signature appearing on the left-hand side of the "with" constraints must exist. A use case for the intended semantics might be reexporting of functor arguments: module Make (Arg : ARG) : S with module Spec = Arg = struct module Spec = Arg ... end It could be bad from a design perspective to lose substructures in "Spec" which were unknown to "S". Markus On Mon, May 9, 2011 at 12:26, Yaron Minsky wrote: > I agree that specializing modules is a reasonable thing to do in general. > But that's not what I think the "with" syntax is usually for.  It's usually > for adding sharing constraints, and this kind of modification of a module is > not the same thing as adding a constraint.  Note that the following code > fails, as I think it should: > >   module type S' = sig end >   with type t = int > > Do you by any chance have a use-case that you think benefits from these > semantics? > > y > > On Mon, May 9, 2011 at 11:12 AM, Markus Mottl > wrote: >> >> The current semantics seems to make sense to me.  E.g. >> >>  module type M' = sig type t end >> >> specifies that M' needs a type t.  It doesn't say that a module >> matching this signature needs to keep t abstract.  You can hence >> specialize this signature using "with" to e.g. require that it be an >> "int". >> >> Module constraints work similarly.  If a signature is empty, this >> doesn't mean that a module matching it must not contain anything, >> rather the opposite: any module can match it.  You can again >> specialize the signature using "with" to require further entries.  The >> module passed to "with" only needs to match the first signature, which >> is trivially true in this case.  Its own (possibly inferred) signature >> will then specialize the previous signature, potentially adding more >> entries. >> >> A maybe more intuitive way to think about this is following: in OCaml >> you can only make things more strict, never less strict.  An empty >> signature is less strict (can be matched by more modules) than a >> non-empty one.  Hence extending it is the right "direction". >> >> Markus >> >> On Mon, May 9, 2011 at 10:27, Yaron Minsky wrote: >> > I've gotten bitten recently by the semantics of "with module", and after >> > getting an explanation about how this seems to work in OCaml, I'm now >> > deeply confused.  Here's the example I was shown: >> > >> >  module M = struct >> >    let x = 13 >> >  end >> > >> >  module type S = sig >> >    module M' : sig end >> >  end >> >  with module M' = M >> > >> > The inferred types for this will be: >> > >> >  module M : sig val x : int end >> >  module type S = sig module M' : sig val x : int end end >> > >> > Whereas I would have expected this: >> > >> >  module M : sig val x : int end >> >  module type S = sig module M' : sig end end >> > >> > In other words, the "with module" constraint has added new structure to >> > the signature S, rather than just adding constraints.  This strikes me >> > as deeply strange, and indeed, has caused a bunch of head-scratching >> > here when using "with module".  Is this a bug?  Or is this really the >> > desired semantics.  My understanding is that in SML, "with module" >> > simply adds in a bunch of type-level sharing constraints.  From that >> > point of view, this behavior is pretty surprising. >> > >> > Not only that, it's what the OCaml manual says.  From section 6.10.4 >> > >> >  The constraint [module module-path = extended-module-path] adds type >> >  equations to all type components of the sub-structure denoted by >> >  [module-path], making them equivalent to the corresponding type >> >  components of the structure denoted by [extended-module-path]. >> > >> > y >> > >> > -- >> > Yaron Minsky >> > >> > -- >> > 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 >> > >> > >> >> >> >> -- >> Markus Mottl        http://www.ocaml.info        markus.mottl@gmail.com >> >> >> -- >> 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 >> > > -- Markus Mottl        http://www.ocaml.info        markus.mottl@gmail.com