From: Mark Shinwell <Mark.Shinwell@cl.cam.ac.uk>
To: caml-list@inria.fr
Subject: Re: [Caml-list] Type inference question
Date: Tue, 26 Apr 2005 14:19:07 +0100 [thread overview]
Message-ID: <20050426131907.GA10841@three-tuns.net> (raw)
In-Reply-To: <17006.11606.297786.728905@gargle.gargle.HOWL>
On Tue, Apr 26, 2005 at 02:00:22PM +0200, Jean-Christophe Filliatre wrote:
> Julien Verlaguet writes:
> > I have the following function definition :
> >
> > let myfun param=
> > let res=Marshal.from_channel stdin [] in
> > if res=param then
> > res
> > else res
> >
> > I was expecting : myfun : 'a -> 'a
> >
> > I got instead : myfun : 'a -> 'b
> >
> > Is it normal ?
>
> Yes. "Marshal.from_channel stdin []" has type 'a and this type is
> generalized in the let/in construct, giving res the type "forall
> 'a. 'a". In the test "res = param", the type of res is instanciated on
> the type of param, but this does not affect the type of the result.
I can understand this behaviour in a case such as the following:
let f v =
let r = fun x -> x in
if r = v then r else r
where as you say the (non-trivial) type scheme assigned to r is
instantiated multiple times, yielding ('a -> 'a) -> 'b -> 'b for f.
However, in the Marshal example above, we have
Marshal.from_channel stdin []
in the first part of the "let". In the SML terminology, this is not a
"nonexpansive expression"[*] (unlike "fun x -> x"). Therefore, I would
have thought that the appearance of such an expression here would
prohibit generalisation (in order to prevent possible unsoundness in the
presence of mutable state). This is presumably not the case in OCaml:
can someone explain why?
Mark
[*] http://www.smlnj.org//doc/Conversion/types.html
--
Mark Shinwell -- email: Mark.Shinwell@cl.cam.ac.uk
Theory and Semantics Group, University of Cambridge Computer Laboratory
next prev parent reply other threads:[~2005-04-26 13:19 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-04-26 11:15 Julien Verlaguet
2005-04-26 12:00 ` [Caml-list] " Jean-Christophe Filliatre
2005-04-26 13:19 ` Mark Shinwell [this message]
2005-04-26 13:41 ` Andreas Rossberg
2005-04-26 13:45 ` Mark Shinwell
2005-04-26 13:54 ` 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=20050426131907.GA10841@three-tuns.net \
--to=mark.shinwell@cl.cam.ac.uk \
--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