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 9F81B7F108 for ; Fri, 27 Nov 2015 00:27:20 +0100 (CET) IronPort-PHdr: 9a23:lOPYxhWF6yfuwvkFpqcPm/4nIELV8LGtZVwlr6E/grcLSJyIuqrYZhOPt8tkgFKBZ4jH8fUM07OQ6PC9HzxZqs/d+Fk5M7VyFDY9wf0MmAIhBMPXQWbaF9XNKxIAIcJZSVV+9Gu6O0UGUOz3ZlnVv2HgpWVKQka3CwN5K6zPF5LIiIzvjqbpq8CVM1wD3Wb1SIgxBSv1hD2ZjtMRj4pmJ/R54TryiVwMRd5rw3h1L0mYhRf265T41pdi9yNNp6BprJYYAu3SNp41Rr1ADTkgL3t9pIiy7UGCHkOz4S45U2YWmxtMSy3M6h3gT5TwtGOus+N71DOLPszwZbEvQS6r9OFxVUm7pj0AMmsW9GzRvenxkq9f6EauoxF5hYvZfoyRHPFkd6XGO9QASjwSDY5qSyVdD9bkPMM0BO0bMLMd9tGlqg== Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=glen.mevel@crans.org; spf=Pass smtp.mailfrom=glen.mevel@crans.org; spf=Pass smtp.helo=postmaster@redisdead.crans.org Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of glen.mevel@crans.org) identity=pra; client-ip=138.231.136.39; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="glen.mevel@crans.org"; x-sender="glen.mevel@crans.org"; x-conformance=sidf_compatible Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of glen.mevel@crans.org designates 138.231.136.39 as permitted sender) identity=mailfrom; client-ip=138.231.136.39; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="glen.mevel@crans.org"; x-sender="glen.mevel@crans.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@redisdead.crans.org designates 138.231.136.39 as permitted sender) identity=helo; client-ip=138.231.136.39; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="glen.mevel@crans.org"; x-sender="postmaster@redisdead.crans.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0BoAACWlFdWnCeI54pVCYMPgW6+FYFkhg8CgTc6EgEBAQEBAQEBEAEBAQEBCBQJT4ItgggBAQQjBAsBDQEBNgEBDwsaAgUWCwICCQMCAQIBRQYNCAEBF4gTAaxlcYRjAQWLHAEBAQEBBQEBAQEZBoEBilGEMSiDHIFEllyNNZxeKAWCOiOBXnGFYAEBAQ X-IPAS-Result: A0BoAACWlFdWnCeI54pVCYMPgW6+FYFkhg8CgTc6EgEBAQEBAQEBEAEBAQEBCBQJT4ItgggBAQQjBAsBDQEBNgEBDwsaAgUWCwICCQMCAQIBRQYNCAEBF4gTAaxlcYRjAQWLHAEBAQEBBQEBAQEZBoEBilGEMSiDHIFEllyNNZxeKAWCOiOBXnGFYAEBAQ X-IronPort-AV: E=Sophos;i="5.20,348,1444687200"; d="scan'208";a="155279323" Received: from redisdead.crans.org ([138.231.136.39]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ADH-AES256-GCM-SHA384; 27 Nov 2015 00:27:19 +0100 Received: from [IPv6:2a01:240:fe3d:4:9c38:4dc7:47e2:13da] (unknown [IPv6:2a01:240:fe3d:4:9c38:4dc7:47e2:13da]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by redisdead.crans.org (Postfix) with ESMTPSA id 41A8C12BB; Fri, 27 Nov 2015 00:27:19 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=crans.org; s=mail; t=1448580439; bh=5w2zDchycndDHx/RvDrtjDhU4y2FtZyValXsMCjdb9I=; h=Subject:To:References:Cc:From:Date:In-Reply-To:From; b=kknTxXB5cClsUN6Xh0iIj6p0wajSb/Kn3cy91Pk8mMnSLGU8XqcSZsc2PdFsRAx8i xqpalqOmxgqhtKV9snt7zzNI14UyHb4su+VscbNbwFq0QraGJeFjueT4wgkMcR1Rgq SdUSX+1KUX4nHwN13YTkVkoP9QjbPvEHwIZ4e/WGLIHqVt+QKEWWIwWbh40ZwNhX9T YNoGEJwm7RczvgRgeGsgbBNjSBhM7Ca4VAxt0W+5pcbaDHmSDouis6ssmnXzIYd4QU F9NdlA9nggkBjx08ENEHGsw93VtaIg9LBa2YXWCg/0XptPEC4F5nmQwVgfJvB1UDfP /oQsOKbM4nEAZXqumSCqhlueLD5W6r+pNo2E1NHlzxrPK1J3jBoGnpPxl4ui0+hiJv wfGKXb6XbI9ifLDcDAxDrCgYrlV2hmaGjhnQL9CE93dccqnzhqrZprScemk6wRZ5JY yGg0eoNstr7T7mMFSNrVaV747ge7YLLhcuinHeGylZyry8bx67K9thjVaAbzM0+H9e 9py/JqgrXrxaeKHja02vKOIC86mtOUW5QTk7nzxu1fuFubZF58ZGh/Cl7LHxfevobJ y+zFwJSbDjIdMsPLEWvgK1WLzg6Hk9UBlZVXvvQT2BcJcBGkIaCbOZdD5tfFO7JS7p bKQCeWremK3IAqltPr/LgMSM= To: Mikhail Mandrykin References: <2885279.d7QpSRfKLJ@molnar> Cc: caml-list@inria.fr From: =?UTF-8?Q?Glen_M=c3=a9vel?= X-Enigmail-Draft-Status: N1010 Message-ID: <565794EF.3050501@crans.org> Date: Fri, 27 Nov 2015 00:25:35 +0100 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: <2885279.d7QpSRfKLJ@molnar> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Caml-list] "map"-ing parameterized class types Le 20/10/2015 13:57, Mikhail Mandrykin a écrit : > Just in case an another possible work-around would be to use an abstract type > instead of a concrete nominal type as a proxy. This can be a little bit more > suitable as an abstract type can be later bound to the same structural type > and wrapping/unwrapping would become identity in the implementation. This is > more heavyweight, though, e.g: > > module type S = sig > type 'a c' > val new_c : 'a -> 'a c' > end > > module rec F' : > functor (M : S) -> sig > class ['a] c : 'a -> object > method get : 'a > method map : 'b. ('a -> 'b) -> 'b M.c' > end > end = > functor (M : S) -> struct > class ['a] c (a : 'a) = object > method get = a > method map : 'b. (_ -> 'b) -> 'b M.c' = fun f -> M.new_c (f a) > end > end > > module rec F : sig > type 'a c' > class ['a] c : 'a -> object > method get : 'a > method map : 'b. ('a -> 'b) -> 'b F.c' > end > val new_c : 'a -> 'a F.c' > val self_cast : 'a c' -> 'a c > end = struct > module F' = F'(F) > class ['a] c = ['a] F'.c > type 'a c' = 'a c > let new_c a = new F.c a > let self_cast (x : 'a c') = (x : 'a c) > end nice solution! just saying, it can be simplified, with no need for functor: module rec F : sig class ['a] c : 'a -> object method get : 'a method map : 'b. ('a -> 'b) -> 'b F.t end type 'a t val make : 'a -> 'a t val cast : 'a t -> 'a c end = struct class ['a] c x = object method get = x method map : 'b. ('a -> 'b) -> 'b F.t = fun f -> F.make (f x) end type 'a t = 'a c let make x = new c x let cast x = x end -- Glen Mével