[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Pierre Weis <Pierre.Weis@i...> |
| Subject: | Re: Ref polymorphism restriction |
> List,
> The following program does not compile, with a
> rather strange error message.
>
> module type SIG =
> sig
> val l : '_a list ref
> val f : '_a -> unit
> end
Warning, there is a strange feature here that makes your '_a as type
schemes paramters (generalized variables) and not type variables:
Objective Caml version 3.00
# module type SIG = sig
val l : '_a list ref
val f : '_a -> unit
end;;
module type SIG = sig val l : 'a list ref val f : 'a -> unit end
#
In effect 'ident means a type scheme parameters. When we introduced
type variables, we denote them by an _ prefix, that was not allowed in
identifiers (as the first character) at that time. Now, identifiers
are allowed to start with an _. Hence '_foo is a perfectly valid
polymorphic type parameter!
> module M : SIG =
> struct
> let l = ref []
>
> let f a = l:= a::!l
> end
>
>
> Modules do not match:
> sig val l : '_a list ref val f : '_a -> unit end
> is not included in
> SIG
> Values do not match:
> val l : '_a list ref
> is not included in
> val l : 'a list ref
>
> Note that the signature for list l IS '_a list ref.
As mentioned above, no: it is 'a list ref. This explains the
typechecker message.
> I suppose this is due to the restriction on polymorphic references.
> Is the OCaml restriction such that references may only be local to
> a single module? Is there a different restriction?
>
> Ohad.
>
> ----------------------------------------------------------
> orodeh@cs.huji.ac.il
> www.cs.huji.ac.il/~orodeh
Anyway, your right: type variables ('_a types) should not escape the
scope of a module.
Merry Christmas,
Pierre Weis
INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/