[
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: | Jacques Garrigue <garrigue@m...> |
| Subject: | Re: [Caml-list] class type inside a sig |
From: Pietro Abate <Pietro.Abate@anu.edu.au> > how can I pass a generic class type inside a signature without > actually specifying the class itself ? > > this is the best I figured out : > > module type S = > sig > type c = < add : int -> 'c > as 'c > val make : unit -> c > end > > module Make ( T:S ) = struct > > (* let init = new T.c *) > let init = T.make () > let add e = init#add e > > end > > but it isn't satisfactory as I've to pass a 'make' function and This is somehow unavoidable: if you want your class type to be generic, then you cannot be sure that its constructor will have the right type. So it is more natural to pass it independently. > if I try to instantiate the module with a super class of c, it gives > me a signature error. [...] > Signature mismatch: > Modules do not match: > sig class c : test val make : unit -> test end > is not included in > S > Type declarations do not match: > type c = < add : int -> c; other : int > > is not included in > type c = < add : int -> 'a > as 'a > > how can I achieve this ? > > Basically I'd like to say: > type c = < add : int -> 'a; .. > as 'a Impossible in ocaml 3.08.3. With ocaml 3.09 (CVS version) type c = private < add : int -> 'a; .. > as 'a is exactly what you are asking for. And before someone asks, you of course cannot inherit from such a generic class (even if it were declared as a class rather than an object type), as there is no way to know what other public methods it could (i.e. they might be incompatible to the ones you add inside your functor.) Jacques