Browse thread
[Caml-list] Naming polymorphic variant types
-
Nick Alexander
-
Jacques Garrigue
- Nick Alexander
- Nick Alexander
-
Jacques Garrigue
[
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: | 2002-08-21 (16:00) |
From: | Nick Alexander <nalexander@a...> |
Subject: | Re: [Caml-list] Naming polymorphic variant types |
> From: "Nick Alexander" <nalexander@amavi.com> > >> module type TEST = >> sig >> type outer = [ `A | `B] >> and inner = [ `B] >> val x : outer -> outer >> val y : inner >> end >> module Test : TEST >> # let p = Test.y;; >> val p : Test.inner = `B >> # let q = Test.x p;; >> ^ >> This expression has type Test.inner = [ `B] but is here used with type >> Test.outer = [ `A | `B] >> The first variant type does not allow tag(s) `A >> >> I'm confused. Can I get an explanation for why the parameter to a >> function with a sum variant type needs all summands to be possible >> arguments? > > Inner is a subtype of outer, but they cannot be unified (unification > requires equality, not subtyping). > > You can get subtyping by writing explicit coercions: > > # let q = Test.x (p :> Test.outer);; > val q : Test.outer = `A > > You can also give polymorphic types to your values in the interface: > val x : [< outer] -> outer > and > val y : [> inner] > are both valid, and one of them is enough to allow (Test.x p) without > coercion. I.e., [< outer] can be unified with inner, and [> inner] can > be unified with outer. Thank you Jacques. I didn't know that you could name < and > types in type declarations. Perfect :) Now, can anyone point me at docs about polymorphic records? I can't find a thing :( They were mentioned in the 3.05 release notes as'- Support for polymorphic methods and record fields.' which could be an extension of the object-based polymorphic records or a really useful extension like the polymorphic variants. Cheers, Nick ------------------- 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