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
next prev 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