Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] streams and value restriction
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Jacques Garrigue <garrigue@k...>
Subject: Re: [Caml-list] streams and value restriction
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