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 3E7D47F168 for ; Thu, 27 Aug 2015 15:36:38 +0200 (CEST) IronPort-PHdr: 9a23:lTworR8Jm710T/9uRHKM819IXTAuvvDOBiVQ1KB92+8cTK2v8tzYMVDF4r011RmSDd6dta4P1baempujcFJDyK7JiGoFfp1IWk1NouQttCtkPvS4D1bmJuXhdS0wEZcKflZk+3amLRodQ56mNBXsq3G/pQQfBg/4fVIsYL+lQciM04/pi6ibwN76XUZhvHKFe7R8LRG7/036l/I9ps9cEJs30QbDuXBSeu5blitCLFOXmAvgtI/rpMYwuwwZgf8q9tZBXKPmZOx4COUAVHV1e1wysfzsqRDGBSGG/H0bQy1Cgx1UCg3P5Qv8WYbZvS7zt+470y6fa57YV7cxDBur5b1qRRugsywHOiQ06imDhcV6lqNWpFS6rBxy2YPOSI6QPft6OKjaeIVJFiJ6Qs9NWnkZUcuHZIwVAr9EZL4Aog== Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=gabriel.scherer@gmail.com; spf=Pass smtp.mailfrom=gabriel.scherer@gmail.com; spf=None smtp.helo=postmaster@mail-ig0-f181.google.com Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of gabriel.scherer@gmail.com) identity=pra; client-ip=209.85.213.181; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="gabriel.scherer@gmail.com"; x-sender="gabriel.scherer@gmail.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of gabriel.scherer@gmail.com designates 209.85.213.181 as permitted sender) identity=mailfrom; client-ip=209.85.213.181; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="gabriel.scherer@gmail.com"; x-sender="gabriel.scherer@gmail.com"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of postmaster@mail-ig0-f181.google.com) identity=helo; client-ip=209.85.213.181; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="gabriel.scherer@gmail.com"; x-sender="postmaster@mail-ig0-f181.google.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0BqAQATEt9VlbXVVdFdhFgGgx2oPpoTAoEoBzsRAQEBAQEBAQEQAQEBAQcNCQkfMIIdggcBAQQSEQQZARsdAQMMBgULDQICJgICIQEBEQEFARwGEyKHdgEDEqVPgS8+MYtAgWyCeYopChknDVaEWQEBAQEGAgEZAQUOgRSKP4JPgjwHgmmBQwEElT2LBoFtgUqRW4NQgh8SI4EXF4QQPDOCTQEBAQ X-IPAS-Result: A0BqAQATEt9VlbXVVdFdhFgGgx2oPpoTAoEoBzsRAQEBAQEBAQEQAQEBAQcNCQkfMIIdggcBAQQSEQQZARsdAQMMBgULDQICJgICIQEBEQEFARwGEyKHdgEDEqVPgS8+MYtAgWyCeYopChknDVaEWQEBAQEGAgEZAQUOgRSKP4JPgjwHgmmBQwEElT2LBoFtgUqRW4NQgh8SI4EXF4QQPDOCTQEBAQ X-IronPort-AV: E=Sophos;i="5.17,422,1437429600"; d="scan'208";a="143971957" Received: from mail-ig0-f181.google.com ([209.85.213.181]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/AES128-GCM-SHA256; 27 Aug 2015 15:36:24 +0200 Received: by igbjg10 with SMTP id jg10so16697066igb.0 for ; Thu, 27 Aug 2015 06:36:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=NbPeBvkJ4WwRlY2a4OKFzAEEhUXL2FFziSv7WI5AeDw=; b=Omi21bWHMJLJr8NJtc8+/pfOdNqVZc9Xw7+wnoSND8K79R/V2VW5RrRcjPVHlnfHJU ONij/RCfqrcksgd3xYVWzAgLxZV0wEOTN7xmwfLq3BKb9zwCW1Nbrkq+OW0yQjzCY4OH eRWKbXtDo+ObcYtkJJfqjdlhwbZ7KUvJS2QjQVcC9PMQXf4q3CBzRzBY1M3GbuyXCPRL hPKPCqhJy4Xt5RwhVW+THT/ayp/rGbCZZLeMZa+Zhf/lAxuu5Vxd6vosBkg3eoy45XZs vnS+AVji6EV2EWSYjIiXOsr+wH9fNZHC1J4PfwIRCXZgPbhKecVMb/xML3lzq4Nsfu7H iovg== X-Received: by 10.50.87.74 with SMTP id v10mr10204998igz.37.1440682582756; Thu, 27 Aug 2015 06:36:22 -0700 (PDT) MIME-Version: 1.0 Received: by 10.79.68.132 with HTTP; Thu, 27 Aug 2015 06:35:43 -0700 (PDT) In-Reply-To: References: From: Gabriel Scherer Date: Thu, 27 Aug 2015 15:35:43 +0200 Message-ID: To: Yotam Barnoy Cc: Ocaml Mailing List Content-Type: text/plain; charset=UTF-8 Subject: Re: [Caml-list] Expanding functors I don't follow. Doesn't module MakeBetter (K : sig include Map.OrderedType val show : t -> string end) = struct include Map.Make(K) let show show_val m = List.show (Pair.show K.show show_val) (bindings m) end suit your need? The extensibility problem I see is that you cannot use the map's internal representation because it is an abstract type -- which prevents from efficiently implementing certain operations -- but this is unrelated to being a functor. On Thu, Aug 27, 2015 at 3:29 PM, Yotam Barnoy wrote: > One problem I've commonly encountered in OCaml is the inability to expand > the interface of functors after they've been created (I'm not talking about > post-application). For example, Map.Make in the stdlib takes an OrderedType > module which contains only the compare function. What happens if I want to > add something to this interface, such as a show function? I have to copy the > whole implementation of Map.Make into my own file to modify it. Compare this > to the ability to 'include' a regular module and just add the new > functionality, and to take the type of a module and expand that type as > needed. Functors are severely lacking in this regard. > > What do people think of this idea -- of allowing functors to be expanded? > Ideally, expanding a functor would allow for both replacing its argument > type (as in the example I gave) and for adding a second/third functor > argument type (so Map.Make(OrderedType) would become > Map.Make(OrderedType)(Show). > > -Yotam