From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by c5ff346549e7 (Postfix) with ESMTPS id AC95D5D5 for ; Mon, 13 Sep 2021 12:22:19 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.84,326,1620684000"; d="scan'208";a="528141814" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 13 Sep 2021 14:22:11 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 1CF52E00C0; Mon, 13 Sep 2021 14:22:11 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id E9D9BE0035 for ; Mon, 13 Sep 2021 14:22:06 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=oleg@okmij.org; spf=Pass smtp.mailfrom=oleg@okmij.org; spf=None smtp.helo=postmaster@mail1.g3.pair.com IronPort-PHdr: =?us-ascii?q?A9a23=3AUndKMhNIUJl0XqRtWvMl6nYrDRdPi9zP1u491JM?= =?us-ascii?q?rhvp0f7i5+Ny6ZQqDv60r3QaCANqTwskHotKei7rnV20E7MTJm1E5W7sIaSU4j?= =?us-ascii?q?94LlRcrGs+PBB6zBvfraysnAJYKDwc9rDm0PkdPBcnxeUDZrGGs4j4OABX/Mhd?= =?us-ascii?q?+KvjoFoLIgMm7yfy+94fXbglVizawYbF/JwiqoAvMscUbnZFsIbsrxBvTpXtId?= =?us-ascii?q?eVWxWd2Kl+Wgh3x+MS+8oN9/ipJo/4u+NJOXqv8f6QjULxXFy8mPHwv5M3qrhb?= =?us-ascii?q?MUw2C7WYBX2oMkxpIBw/F7AzmXpr0ryD3uPZx1DWcMMbrS70/RDas4LpxSBLwh?= =?us-ascii?q?ikJNyA3/nzUhMN/kK1UvRyuqgdjw4LIeoyZKOZyc7nDcd4cWGFPXtxRVytEAo6?= =?us-ascii?q?kdoUPC/QOPelFpIT6oFsOqQWxBQa3CePoyT9Ig3723a8g3+QmCwHG0xUtEtQTu?= =?us-ascii?q?3vbsNv7Lr0dUfypzKbW1zXDaetb1DTz5oXGcB0sv/6BUKx+fMfV1UUjCwzLg1e?= =?us-ascii?q?ep4HrMD6Y1OcAvnSb4ed8Wu+ilXMrpQ5vrjav2MsihY3EiIIbxF3C6C53zoE1J?= =?us-ascii?q?diiR056Z96pCJxQtyKfN4t3QMMuWWZouDw1yrAApJW1fzAKxYwmyhPecfCKfYy?= =?us-ascii?q?F7gjtWeqLPDt0mX1odKqhixqv7USs0PDwW8e33VpQrydJiMTAum0O2hHV98OJU?= =?us-ascii?q?OFy/l271jaKzw3T6v9LIUQzlafDLp4u2L8wlp4OvUjZES/7ll/6jLeMeUUl4Oi?= =?us-ascii?q?k8fjoYrLjppOENo90jB/xMrg2l8G+AOk0KAYDUmyB9emyzrHv4FD1TbpSgv0zi?= =?us-ascii?q?KbZsZTaJcoBpq6+Bg9YyoEj6xKhADepy9kYmnoHLFdEeBKFlYTpPEvOIP/gAfe?= =?us-ascii?q?ln1usiCtrx+zBPrD5HprCNH3DkLP4cbZ56k5c0xYzwMtE55NUD7EBOOj8VlXwt?= =?us-ascii?q?NzeFB85Mha7z/zpCNVnhcsiXjeEC6qddafTqkOg5+Q1IuDKapVGliz6Lq0C4/P?= =?us-ascii?q?hxSs+nVISVa6q2JoVLneiEaI1cA2ifXPwj4JZQi8xtQ0kQbmy4LVjeTtaZnLrG?= =?us-ascii?q?a1noCkyCZjgBoDGFNjFaFmp2yS+H58QYXpJWAjk+ZjAcIaBWvVKbzidcJYJrw?= =?us-ascii?q?=3D=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AGh2RWalXQr5HwnnMiT8bUUA72TbpDfIu3DAb?= =?us-ascii?q?v31ZSRFFG/Fw5Pre5cjztCWE7gr5N0tQ++xoVJPgfZqYz+8T3WBzB8bHYOCFgh?= =?us-ascii?q?rKEGgK1+KLqFeMJ8S9zIFgPMxbH5SWZuefMbE3t7ee3OHkfuxB/OW6?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DUAACYahphmHIDJ0JaHgEBCxIMQIR7V?= =?us-ascii?q?wE5MY1LhkWCJJ1nCwEDAQ01CgIEAQGHTgIdBwEENBMBAgQVAQEFAQEBAgEDAwQ?= =?us-ascii?q?BEwEBAQEBAQEBCQsQBjokhTsIJQ2CNSKELDOBAYNNAYMGAQ+naoEzgQGKGoE6j?= =?us-ascii?q?hoPDYFIRYQ6gwkXA4IsgwCCLgSEKoEiATBWFmihCZxqM4MygUKBUocpk3tFhS2?= =?us-ascii?q?BN6ARok+ZB4F3gX1NMAg7gmkJRxkOiVuEXohthVkyATE4AgYLAQEDCWuJCgEB?= X-IPAS-Result: =?us-ascii?q?A0DUAACYahphmHIDJ0JaHgEBCxIMQIR7VwE5MY1LhkWCJJ1?= =?us-ascii?q?nCwEDAQ01CgIEAQGHTgIdBwEENBMBAgQVAQEFAQEBAgEDAwQBEwEBAQEBAQEBC?= =?us-ascii?q?QsQBjokhTsIJQ2CNSKELDOBAYNNAYMGAQ+naoEzgQGKGoE6jhoPDYFIRYQ6gwk?= =?us-ascii?q?XA4IsgwCCLgSEKoEiATBWFmihCZxqM4MygUKBUocpk3tFhS2BN6ARok+ZB4F3g?= =?us-ascii?q?X1NMAg7gmkJRxkOiVuEXohthVkyATE4AgYLAQEDCWuJCgEB?= X-IronPort-AV: E=Sophos;i="5.84,326,1620684000"; d="scan'208";a="528141754" X-MGA-submission: =?us-ascii?q?MDEIs7TdX7mrx16ntaxjuYWdqShy2Ub00wqvwW?= =?us-ascii?q?9JwkKasHEnjjVgsGtTDgtC8wL16tToieTJV/VBHO/Z99ssEqJHeJIBe5?= =?us-ascii?q?qhGGQUIkE71bWHRv6nui9PlqCF0/rFsmx31IG0q2ncFuKQASfzXy9+NJ?= =?us-ascii?q?xlGqdP+dC7YU0htty2pPU6Cg=3D=3D?= Received: from mail1.g3.pair.com ([66.39.3.114]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Sep 2021 14:22:05 +0200 Received: from mail1.g3.pair.com (localhost [127.0.0.1]) by mail1.g3.pair.com (Postfix) with ESMTP id 3F4843FB4A9; Mon, 13 Sep 2021 08:22:03 -0400 (EDT) Received: from Melchior.localnet (118.6.138.210.rev.vmobile.jp [210.138.6.118]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail1.g3.pair.com (Postfix) with ESMTPSA id 90CC3583791; Mon, 13 Sep 2021 08:22:01 -0400 (EDT) Date: Mon, 13 Sep 2021 21:21:39 +0900 From: Oleg To: caml-list@inria.fr Message-ID: <20210913122139.GA3696@Melchior.localnet> Mail-Followup-To: Oleg , caml-list@inria.fr MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) Subject: [Caml-list] Higher-kinded bounded polymorphism Reply-To: Oleg X-Loop: caml-list@inria.fr X-Sequence: 18566 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: Abstraction over polymorphic types is something that one comes across from time to time, especially when implementing operations generic over collections, or embedding typed DSLs (particularly in tagless-final style). One immediately learns that OCaml does not have higher-kinded type variables (type variables that range over type constructors like list and array); does not permit type constructors appearing by themselves, without being applied to the right number of arguments; and restricts polymorphic types in other ways (e.g., not allowing them in type constraints of package types). One soon learns that the module system (using functors) is a way to realize higher-kinded polymorphism in OCaml. It takes longer to learn it is not the only way, however. The following web page is written to speed up this learning. It collects what I have learned and rediscovered on this topic, arranged into a single story and with new explanations and attributions (and occasionally, new variations). http://okmij.org/ftp/ML/higher-kind-poly.html One interesting discovery is that some problems that ostensibly require higher-kinded polymorphism really do not. The article comes with the complete accompanying code.