Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] restricting polymorphic variants
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Laurent Vibert <lvibert@i...>
Subject: Re: [Caml-list] restricting polymorphic variants
On Thu, 31 Jan 2002, David Monniaux wrote:

> Let us say I have a module M as follows:
> module M = struct type op=[`A|`B] let f: op->int=function `A->0|`B->1 end;
> 
> I cannot just sat that f has type [< `A|`B]->int because M has to fit
> within a signature:
> module type MT=sig type op val f: op->int end;;
> 
> I would like to obtain another module where f only accepts `A:
> # module N = struct type op=[`A] let f: op->int=M.f end;;
>                                                 ^^^
> Let us try eta-expansion:
> # module N = struct type op=[`A] let f: op->int=fun x->M.f x end;;
>

this one work with an explicit coercion :
module N = struct type op=[`A] let f: op->int=fun x->M.f (x:>M.op) end;;


> Well, let us try enumerating all the constructors in the closed type op!
> # module N = struct type op=[`A] let f: op->int=function (`A as x)->M.f x
> end;;

or faster :
module N = struct type op=[`A] let f (#op as x) = M.f x end;;

-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs  FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr  Archives: http://caml.inria.fr