caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] streams and value restriction
@ 2003-02-07  1:31 Chris Hecker
  2003-02-07  7:36 ` Jacques Garrigue
  0 siblings, 1 reply; 2+ messages in thread
From: Chris Hecker @ 2003-02-07  1:31 UTC (permalink / raw)
  To: caml-list


I assume I'm running into the polymorphism restriction thing here, but
I'm not sure why (I kind of understand it when references are in play,
but this is baffling me).

Here's a simple version of some stream parser code.  I'd like
parse_opt_comma_list to be polymorphic so I can use it to parse lists
of any of my values.  It works fine as a separate let rec, but if I
put it in the overall let rec of the main parser (with and) it won't
generalize and gets tagged as string-only since that's the first way
it's used.

Can somebody explain why this is a problem?  Sorry for being dense.

Thanks,
Chris


type t =
    Int of int
  | String of string

(* this works: *)
let rec parse_opt_comma_list parse list = parser
    [< 'Genlex.Kwd ",";
       a = parse ;
       optlist = parse_opt_comma_list parse (a::list) >] -> optlist
  | [< >] -> list

let rec parse_values = parser
    [< 'Genlex.String s;
       optlist = parse_opt_comma_list (parser [< 'Genlex.String s >] -> s) [] >] ->
         (String s) :: List.map (fun s -> String s) optlist
  | [< 'Genlex.Int i;
       optlist = parse_opt_comma_list (parser [< 'Genlex.Int i >] -> i) [] >] ->
         (Int i) :: List.map (fun i -> Int i) optlist

(* this doesn't: *)
let rec parse_values = parser
    [< 'Genlex.String s;
       optlist = parse_opt_comma_list (parser [< 'Genlex.String s >] -> s) [] >] ->
         (String s) :: List.map (fun s -> String s) optlist
  | [< 'Genlex.Int i;
       optlist = parse_opt_comma_list (parser [< 'Genlex.Int i >] -> i) [] >] ->
         (Int i) :: List.map (fun i -> Int i) optlist

and parse_opt_comma_list parse list = parser
    [< 'Genlex.Kwd ",";
       a = parse ;
       optlist = parse_opt_comma_list parse (a::list) >] -> optlist
  | [< >] -> list


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


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Caml-list] streams and value restriction
  2003-02-07  1:31 [Caml-list] streams and value restriction Chris Hecker
@ 2003-02-07  7:36 ` Jacques Garrigue
  0 siblings, 0 replies; 2+ messages in thread
From: Jacques Garrigue @ 2003-02-07  7:36 UTC (permalink / raw)
  To: checker; +Cc: caml-list

From: Chris Hecker <checker@d6.com>

> I assume I'm running into the polymorphism restriction thing here, but
> I'm not sure why (I kind of understand it when references are in play,
> but this is baffling me).
> 
> Here's a simple version of some stream parser code.  I'd like
> parse_opt_comma_list to be polymorphic so I can use it to parse lists
> of any of my values.  It works fine as a separate let rec, but if I
> put it in the overall let rec of the main parser (with and) it won't
> generalize and gets tagged as string-only since that's the first way
> it's used.

There are two restrictions to polymorphism.
One is the infamous value restriction. But this is not the case here.
Another one it that polymorphic values are only generalized after
typing a group of recursive definitions.
That is, you cannot use a value polymorphically inside the same group
of recursive definitions. If you want to do that, you must move your
definition out of the group (you found that yourself).
This is also true for mutually recursive classes, but no longer for
type definitions (their polymorphism is explicit).

There are known solutions to this problem (search this list for
"polymorphic recursion"), but no general one is implemented in ocaml
(general ones are not complete, but some are pretty good).

Note that you can use polymorphic recursion between methods in a class
(using polymorphic methods), but this is a bit far-fetched for your
problem.

Jacques Garrigue
-------------------
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


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-02-07  7:36 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-02-07  1:31 [Caml-list] streams and value restriction Chris Hecker
2003-02-07  7:36 ` Jacques Garrigue

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).