Browse thread
The universal variable 'a would escape its scope
-
Christophe TROESTLER
- Jacques Garrigue
[
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: | 2005-01-06 (00:24) |
From: | Jacques Garrigue <garrigue@m...> |
Subject: | Re: [Caml-list] The universal variable 'a would escape its scope |
From: Christophe TROESTLER <Christophe.Troestler@umh.ac.be> > I got a variant of the error > http://caml.inria.fr/archives/200207/msg00110.html and I do not > understand it. Here is a small example showing it: > > # type 'a t = < output : (string -> unit) -> unit; .. > as 'a;; > type 'a t = 'a constraint 'a = < output : (string -> unit) -> unit; .. > > > # class a = object > method f : 'a. 'a t -> unit = fun o -> o#output print_string > end;; > method f : 'a. 'a t -> unit = fun o -> o#output print_string > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > This expression has type < output : (string -> unit) -> unit; .. > > but is here used with type < output : (string -> unit) -> unit; .. > > The universal variable 'a would escape its scope > > Is there something one can do about this? The problem is that ['a. (< m : t; .. > as 'a)] is interpreted in a special way, 'a meaning the row variable rather than the whole type, and that does not work with constrained types. The workaround is to use a class-type: # class type t = object method output : (string -> unit) -> unit end;; class type t = object method output : (string -> unit) -> unit end # class a = object method f : 'a. (#t as 'a) -> unit = fun o -> o#output print_string end;; class a : object method f : #t -> unit end This does exactly what you want. Jacques Garrigue