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