From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id C3A537EE11 for ; Fri, 22 Aug 2014 05:17:31 +0200 (CEST) Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of daniel.buenzli@erratique.ch) identity=pra; client-ip=74.55.86.74; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="daniel.buenzli@erratique.ch"; x-sender="daniel.buenzli@erratique.ch"; x-conformance=sidf_compatible Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of daniel.buenzli@erratique.ch) identity=mailfrom; client-ip=74.55.86.74; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="daniel.buenzli@erratique.ch"; x-sender="daniel.buenzli@erratique.ch"; x-conformance=sidf_compatible Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of postmaster@smtp.webfaction.com) identity=helo; client-ip=74.55.86.74; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="daniel.buenzli@erratique.ch"; x-sender="postmaster@smtp.webfaction.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhECALu19lNKN1ZKnGdsb2JhbABZhhGBIrNhnVABgSUQAQEBAQEGDQkJFCmEBAEFIwRiCxoCGQ0CAkcQBhuIOgSudpURF4EsjW06gnk2gR0BBJIjkTkYkTyDOgEBAQ X-IPAS-Result: AhECALu19lNKN1ZKnGdsb2JhbABZhhGBIrNhnVABgSUQAQEBAQEGDQkJFCmEBAEFIwRiCxoCGQ0CAkcQBhuIOgSudpURF4EsjW06gnk2gR0BBJIjkTkYkTyDOgEBAQ X-IronPort-AV: E=Sophos;i="5.04,377,1406584800"; d="scan'208";a="75784873" Received: from mail6.webfaction.com (HELO smtp.webfaction.com) ([74.55.86.74]) by mail3-smtp-sop.national.inria.fr with ESMTP; 22 Aug 2014 05:17:30 +0200 Received: from [172.20.10.2] (188.29.165.213.threembb.co.uk [188.29.165.213]) by smtp.webfaction.com (Postfix) with ESMTP id B36F166EA0E5 for ; Fri, 22 Aug 2014 03:17:27 +0000 (UTC) Date: Fri, 22 Aug 2014 04:17:33 +0100 From: =?utf-8?Q?Daniel_B=C3=BCnzli?= To: Caml-list Message-ID: <83ADBE14262643EA9519BBE719987901@erratique.ch> In-Reply-To: <4060AF3441F149839C46804E64E2B9CE@erratique.ch> References: <4060AF3441F149839C46804E64E2B9CE@erratique.ch> X-Mailer: sparrow 1.6.4 (build 1178) MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Subject: Re: [Caml-list] Phantom types and variants Sorry the coerce function type was wrong in my preceding message. Here is the example: ----- module M : sig type kind = [ `A | `B ] type +'a t constraint 'a = [< kind ] val a : unit -> [> `A] t val b : unit -> [> `B] t val coerce : ([< kind] as 'a) -> 'b t -> 'a t end = struct type kind = [ `A | `B ] type +'a t = { kind : kind } constraint 'a = [< kind] let a () = { kind = `A } let b () = { kind = `B } let coerce k v = if v.kind <> k then invalid_arg "" else v end let (vl : [`A | `B ] M.t list) = [M.a (); M.b ()] let (v : [`A] M.t) = M.coerce `A (List.hd vl) ------ and the error: Values do not match: val coerce : kind -> ([< kind ] as 'a) t -> 'a t is not included in val coerce : ([< kind ] as 'a) -> [< kind ] t -> 'a t