Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] Polymorphic variants and signatures
[ 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] Polymorphic variants and signatures
From: brogoff@speakeasy.net

>     I've run into some issues with polymorphic variants that I can't find 
> addressed in the manual. I'd like to define a module type which looks 
> (simplified) like this
> 
> module type CELL_TYPE =
>   sig
>     type ('a, 'b) t
> 
>     val show_rec :
>         ('a -> ('b -> string) -> string) -> ([< ('b, 'a) t ] *  'c) inst ->
>             ('b -> string) -> string
>     ...
> 
>   end
> 
> and obviously I can't because ('a, 'b) t is not a polymorphic variant type. 
>
> Is there some way I can write such a module type, and, after having
> written it, use it in a functor as follows, 
> 
> module Make (Cell : CELL_TYPE) = 
>   struct 
>     type ('a, 'b) t = [`Newtag of 'b list | ('a, 'b) Cell.t]
> 
>     (* and some dispatch on `Newtag and #Cell.t *)
>   end

This is just plain impossible. In order to dispatch on a variant
type, you must explicitely know all its cases. If Cell.t is
abstract,then the pattern #Cell.t is not defined. Even allowing just
your type definition would make then implementation unsound (all
complete variant types must known).

This is just the same thing as with objects: you cannot build a functor
to create a class inheriting from a class given in parameter, as long
as you don't give an explicit class type for the parameter, indicating
at least all the public methods.

Polymorphic variant don't mix well with functors: they allow
incremental progamming, but not type abstraction. Do you really need a
functor here? Actually, both variants and objects alleviate a great
part of the need for functors.

Of course, if you make t concrete in CELL_TYPE, there is no problem.

Not very helpful,

    Jacques

-------------------
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