Version française
Home     About     Download     Resources     Contact us    
Browse thread
class type inside a sig
[ 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@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