From: "Charles Hymans" <charles.hymans@gmail.com>
To: "Josh Berdine" <jjb@microsoft.com>
Cc: "caml-list@yquem.inria.fr" <caml-list@yquem.inria.fr>
Subject: Re: [Caml-list] typing of recursive modules in 3.10.2
Date: Wed, 11 Jun 2008 12:51:21 +0200 [thread overview]
Message-ID: <676aba050806110351q7bedc2ccs31ca5867c39cfd41@mail.gmail.com> (raw)
In-Reply-To: <857DD0FDAC042B4485F9F5F4EA675104166C8EB605@EA-EXMSG-C332.europe.corp.microsoft.com>
[-- Attachment #1: Type: text/plain, Size: 3057 bytes --]
Thanks for the answer and links, Josh.
I had also noticed that annotating the argument with type t solved the
problem.
However the current behavior of the type-checker is really awkward to me. I
hope it is improved in the future to make the use of recursive modules more
intuitive and less of a black art.
Best regards,
On Wed, Jun 11, 2008 at 11:25 AM, Josh Berdine <jjb@microsoft.com> wrote:
> Hi Charles,
>
>
>
> I don't know if it helps, and this doesn't address your concern over
> predictability, but your example will also typecheck if you annotate the
> argument of f with t:
>
>
>
> let f (x : t) = A.g x
>
>
>
> I can't claim to be able to explain just why that helps, but without the
> annotation it seems that when typechecking structure B, the typechecker
> needs to know the type equality t = B.t directly, while either adding the
> annotation or destructing the pair causes the type definitions to be
> unfolded once.
>
>
>
> The following threads seem to be related:
>
>
> http://caml.inria.fr/pub/ml-archives/caml-list/2007/05/d9414d45a9a6f30f2609e08c43f011a0.en.html
>
>
> http://caml.inria.fr/pub/ml-archives/caml-list/2007/06/0d23465b5b04f72fedecdd3bbf2c9d72.en.html
>
>
>
> There is also a related bug (4266) in the database.
>
>
>
> Cheers, Josh
>
>
>
>
>
> *From:* caml-list-bounces@yquem.inria.fr [mailto:
> caml-list-bounces@yquem.inria.fr] *On Behalf Of *Charles Hymans
> *Sent:* Tuesday, June 10, 2008 8:27 PM
> *To:* caml-list@yquem.inria.fr
> *Subject:* [Caml-list] typing of recursive modules in 3.10.2
>
>
>
> Hi,
>
>
>
> I have encountered a behavior of the type checking of recursive modules
> which is hard for me to understand.
>
> Especially so, since the code used to compile with Ocaml 3.10.0 but does
> not with 3.10.2. And, an almost similar piece of code compiles correctly.
>
>
>
> I tried to extract the smallest piece of code that exhibits the problem,
> but it's still quite long. Sorry.
>
>
>
> Here is the code that does not type with 3.10.2:
>
> =======================================
>
>
>
> module type BSig =
> sig
> type t
> val f: t -> unit
> end
>
> module type ASig = functor(B: BSig) ->
> sig
> type t
> val g: B.t -> unit
> end
>
> module Make(C: BSig) =
> struct
> type t = int
> let g _ = ()
> end
>
> module MakeA = (Make: ASig)
>
> module rec A:
> sig
> type t
> val g: B.t -> unit
> end
> = MakeA(B)
>
> and B:
> sig
> type t = int * A.t
> val f: t -> unit
> end
> =
> struct
> type t = int * A.t
>
> let f x = A.g x (* does not type *)
> (*
> let f (a, b) = A.g (a, b) (* types correctly *)
> *)
> end
>
>
> =========================
>
>
>
> Note that if function f is replaced by the commented version, then the type
> checker succeeds. Even though, this code modification is only giving the
> additional information that the argument of f is a pair.
>
>
>
> It would be nice for both versions of the code to compile, because the
> current behavior of the type checker seems to me not easily predictable.
>
>
>
> Thank you in advance for your help,
>
>
>
[-- Attachment #2: Type: text/html, Size: 5767 bytes --]
prev parent reply other threads:[~2008-06-11 10:51 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-10 19:27 Charles Hymans
2008-06-11 9:25 ` [Caml-list] " Josh Berdine
2008-06-11 10:51 ` Charles Hymans [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=676aba050806110351q7bedc2ccs31ca5867c39cfd41@mail.gmail.com \
--to=charles.hymans@gmail.com \
--cc=caml-list@yquem.inria.fr \
--cc=jjb@microsoft.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