caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] restricting polymorphic variants
@ 2002-01-31  6:38 David Monniaux
  2002-01-31  9:19 ` Laurent Vibert
  0 siblings, 1 reply; 2+ messages in thread
From: David Monniaux @ 2002-01-31  6:38 UTC (permalink / raw)
  To: Liste CAML

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;;
                                                ^^^
This expression has type M.op -> int but is here used with type op -> int

Let us try eta-expansion:
# module N = struct type op=[`A] let f: op->int=fun x->M.f x end;;
                                                           ^
This expression has type op = [ `A] but is here used with type
  M.op = [ `A | `B]

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;;
module N : sig type op = [ `A] val f : op -> int end

Ok, it now works, but it is a bit clumsy: the typer knows all the
constructors of type N.op, which all fit into type M.op, why should I have
to enumerate them again?

This would not be so bad if this code was optimized away (after all, this
is a tail call with the same argument). Is it the case?


David Monniaux            http://www.di.ens.fr/~monniaux
Laboratoire d'informatique de l'École Normale Supérieure,
Paris, France


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


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Caml-list] restricting polymorphic variants
  2002-01-31  6:38 [Caml-list] restricting polymorphic variants David Monniaux
@ 2002-01-31  9:19 ` Laurent Vibert
  0 siblings, 0 replies; 2+ messages in thread
From: Laurent Vibert @ 2002-01-31  9:19 UTC (permalink / raw)
  To: caml-list

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


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2002-01-31  9:19 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-01-31  6:38 [Caml-list] restricting polymorphic variants David Monniaux
2002-01-31  9:19 ` Laurent Vibert

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).