From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id DAA00793; Thu, 22 Aug 2002 03:24:05 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id DAA00925 for ; Thu, 22 Aug 2002 03:24:04 +0200 (MET DST) Received: from gianther.hypbus.com (h209-139-221-5.gtconnect.net [209.139.221.5]) by nez-perce.inria.fr (8.11.1/8.11.1) with SMTP id g7M1O1n08245 for ; Thu, 22 Aug 2002 03:24:02 +0200 (MET DST) Received: (qmail 18631 invoked by uid 71); 22 Aug 2002 01:26:36 -0000 Received: from unknown (HELO mail.gx.ca) (127.0.0.1) by localhost with SMTP; 22 Aug 2002 01:26:36 -0000 Received: from 207.194.7.55 (SquirrelMail authenticated user nalexand) by mail.gx.ca with HTTP; Wed, 21 Aug 2002 18:26:36 -0700 (PDT) Message-ID: <1066.207.194.7.55.1029979596.squirrel@mail.gx.ca> Date: Wed, 21 Aug 2002 18:26:36 -0700 (PDT) Subject: Re: [Caml-list] Naming polymorphic variant types -- additional questions From: "Nick Alexander" To: In-Reply-To: <20020821142724W.garrigue@kurims.kyoto-u.ac.jp> References: <1413.207.194.7.18.1029903741.squirrel@mail.gx.ca> <20020821142724W.garrigue@kurims.kyoto-u.ac.jp> X-Priority: 3 Importance: Normal X-MSMail-Priority: Normal Cc: Reply-To: nalexander@amavi.com X-Mailer: SquirrelMail (version 1.2.6) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk > From: "Nick Alexander" > >> 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. When I was trying this, I accidently tried: type outer = [< 'A | 'B] and was duly rewarded with Unbound type parameter [..] I understand that this is not what Jacques recommended! I'm wondering if someone can tell me what this means, and when this construction could possibly be necessary. I am also a neophyte polymorphic variants user. It seems very intuitive to me that [`A] is a subtype of [`A | `B]. Jacques informs me that unification rejects the subtyping in favour of equality. So, what is the situation where [`A] is _not_ a subtype of [`A | `B]? Ie, what common construct, design pattern, or idiom reflects this? Thanks for the great support, 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