caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Pierre Weis <pierre.weis@inria.fr>
To: checker@d6.com (Chris Hecker)
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] monomorphic restriction or typing/scanf bug?
Date: Tue, 15 Oct 2002 14:19:43 +0200 (MET DST)	[thread overview]
Message-ID: <200210151219.OAA28770@pauillac.inria.fr> (raw)
In-Reply-To: <200210150329.g9F3TAX26896@plinky.bolt-action.com> from Chris Hecker at "Oct 14, 102 08:29:10 pm"

> The "scan" function in the code below works if it's at global scope,
> but not if it's defined inside the test2 function.  Is this a bug or a
> typing restriction?  I assume the latter (and that I could have boiled
> this example to one of the ones in the FAQ?), but I don't understand
> these kinds of polymorphism typing issues.
> 
> Chris
> 
> 
> type t =
>     Foo of int
>   | Bar of int * int 
> 
> exception FB of t
> 
> 
> (* works *)
> let scan s (fmt : ('a, Scanf.Scanning.scanbuf, 'b) format) f =
>   try
>     raise (FB (Scanf.sscanf s fmt f))
>   with
>     End_of_file | Scanf.Scan_failure _ -> ()
> 
> let test () =
>   let line = "Foo 1" in
>   try
>     scan line "Foo %d" (fun i -> Foo i);
>     scan line "Bar %d %d" (fun i j -> Bar (i,j));
>     failwith "bad line"
>   with
>     FB t -> t
> 
> (* doesn't work *)
> let test2 () =
>   let line = "Foo 1" in
>   let scan s (fmt : ('a, Scanf.Scanning.scanbuf, 'b) format) f =
>     try
>       raise (FB (Scanf.sscanf s fmt f));
>       ()
>     with
>       End_of_file | Scanf.Scan_failure _ -> ()
>   in
>   try
>     scan line "Foo %d" (fun i -> Foo i);
>     scan line "Bar %d %d" (fun i j -> Bar (i,j));
>     failwith "bad line"
>   with
>     FB t -> t
> 
> -------------------
> To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
> Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners

This is unrelated to Scanf (apart from the fact that sscanf is
polymorphic).

This is not a bug, this is not a typing restriction, this is an ugly
semantics of type constraints.

The problem is that type variables in type constraints are shared (are
not generalized whatsoever) in a whole definition. Hence, the 'a and
'b in your format specification accumulate incompatible type
constraints (type instance unifications), hence the typing error
reported by the compiler.

On the other hand, when the scan function is global, 'a and 'b are
generalized at the hand of the definition as usual (since their is no
use of scan, hence no instanctiation of 'a nor 'b). Hence the global
definition does not behave teh same as the local one.

To give a simpler example, consider this simple (working) code snippet:

# let test () =
    let f x = x in
    f 1; f "1";;
Warning: this expression should have type unit.
val test : unit -> string = <fun>

Now, consider I add a single (and useless) type constraint on the x
parameter of f, just stating that it should have a type:

# let test () =
    let f (x : 'a) = x in
    f 1; f "1"
  ;;
Warning: this expression should have type unit.
This expression has type string but is here used with type int

The phrase it rejected since the type ('a) of the parameter (x) of f
has been instantiated once with int, and then further instantiation to
string fails (the warning emitted by the compiler clearly states that
"f 1" was properly type-checked).

Thnaks for the interesting example, that could help us to revised the
semantics of type constraints in Caml, still having in mind that
global and local definition should always behave the same.

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


  parent reply	other threads:[~2002-10-15 12:19 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-10-15  3:29 Chris Hecker
2002-10-15  3:51 ` Jacques Garrigue
2002-10-15 12:19 ` Pierre Weis [this message]
2002-10-15 21:03   ` Chris Hecker
2002-10-15 21:20     ` Chris Hecker
     [not found]     ` <Pine.LNX.4.44.0210151424320.453-100000@grace.speakeasy.net >
2002-10-16  1:53       ` Chris Hecker
2002-10-16  6:42         ` [Caml-list] Local open (was: monomorphic restriction or typing/scanf bug?) Alain Frisch

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=200210151219.OAA28770@pauillac.inria.fr \
    --to=pierre.weis@inria.fr \
    --cc=caml-list@inria.fr \
    --cc=checker@d6.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;
as well as URLs for NNTP newsgroup(s).