caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
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


  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;
as well as URLs for NNTP newsgroup(s).