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 E4BA75D5 for ; Tue, 30 Jun 2020 16:25:52 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.75,298,1589234400"; d="scan'208";a="457503377" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 30 Jun 2020 18:25:51 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 9DC69E0171; Tue, 30 Jun 2020 18:25:51 +0200 (CEST) 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 7114CE0129 for ; Tue, 30 Jun 2020 18:25:48 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=sampablokuper@posteo.net; spf=Pass smtp.mailfrom=sampablokuper@posteo.net; spf=None smtp.helo=postmaster@mout01.posteo.de IronPort-PHdr: =?us-ascii?q?9a23=3AoTE6GhAg2UvKUBzMEvZBUyQJP3N1i/DPJgcQr6Af?= =?us-ascii?q?oPdwSPXzrsbcNUDSrc9gkEXOFd2Cra4d1ayO6+u+CCRAuc/H7ClfNsQUFlcsso?= =?us-ascii?q?Y/p0QYGsmLCEn2frbBThcRO4B8bmJj5GyxKkNPGczzNBX4q3y26iMOSF2kbVIm?= =?us-ascii?q?buv6FZTPgMupyuu854PcYxlShDq6fLh+MAi6oR/eu8ULgIZuMLo9xgfGrnZJf+?= =?us-ascii?q?ld2GdkKU6Okxrm6cq84Z5u/z5Mt/498sJLTLn3cbk/QbFEFjotLno75NfstRnN?= =?us-ascii?q?TAuP4mUTX2ALmRdWAAbL8Q/3UI7pviT1quRy1i+aPdbrTb8vQjSt871rSB7zhy?= =?us-ascii?q?gZMTMy7XzahdZxjKJfpxKhugB/zovJa4ybKPZyYqXQds4BSGFfQsheSTBOAoKk?= =?us-ascii?q?b4sOEeUBO/pYr5LgrFcKtBeyGBWgCP/qxjJOgXD4wLA60/85EQ7YwAMgA9wAsH?= =?us-ascii?q?PRrNrvNacSV/2+wK3HwDjHav9b3yr25orVfRA7ufyCU7J+f9TMx0csGAzKkkif?= =?us-ascii?q?pJf5Pz+JzOkBr3SX4/Z+We+plmUpqxtxoj+qxso0l4fGnIcVwU3B+yVk2IY6O8?= =?us-ascii?q?e4Q1N8bN6/CpRQsjmaOJFtTcMmRGFouzs6yqUYtp6hZyUK0JMnxwXDa/OZdIiE?= =?us-ascii?q?+BTjW/iNITphgn9uZb2wiQqo/0e61u38Ste70ExMriddnNTBtWwB2hPS58WFVv?= =?us-ascii?q?dw+lut1SqA2g3Q7uxIPFw5mbTbJZAuzLA+mJQevVrfEiPohkj7jqubeEsr9Oam?= =?us-ascii?q?6Onrf7PrrYKSOY9zjwHxKKUumsqnDOQmKAQOUHWU9OKh37Pg5U30WKhGg/42n6?= =?us-ascii?q?XDsZ3XJ94Xq6C4DgNP04su6w6zAjSi3dgCgHUKI1NIdAiZg4T3J13COu30APmj?= =?us-ascii?q?j1mqjTxl3erJPqf7DZXINnXDkKnufbJ660NEzQozys1f545IBr0cOv7zQkjxtM?= =?us-ascii?q?fEDhAnNAy42fvoB8tl2oMfX2KAHLOZPbvPvVKL5u8jOeiBaY0PtDvzKvUp/f/j?= =?us-ascii?q?gH8hlV8YZ6ap3J8XaH6iHvRhJkWUeWHsjc0EEWcSpAUxV+jqiFqBUT5Of3a9Qb?= =?us-ascii?q?g86yojCIKhFofDWp6igLub0Ce9AJJWenhKCkqQHnfwa4WER/AMZTqOLcB7lzwE?= =?us-ascii?q?UaGtS4sg1RG1qA/30KFnL+rR+i0Ar53vztl15+vJlREz7zN4Fcqd03veB11zyy?= =?us-ascii?q?ktY3c91aV75Eh80UvLka9zivlcXdBS/PhUSRx7f9aIxOV/D5X2WxndVtaPUlev?= =?us-ascii?q?BNu8V2IfVNU0luQHZg5eBs2vlFiXxCOvG7Yfk7uIGYQ56IrE2GPtKsE7zXvagv?= =?us-ascii?q?pyx2I6S9dCYDX1zpV08BLeUsuUyhzExZbvTrwV2Wv2zEnGzWeKuxgIAgt3TLmd?= =?us-ascii?q?BDYHYVDKoNO/6k6QF+b/W4RiCRNIzIu5EoUPb9ToiVtcQ/K6YobGZHmtlmD2Ax?= =?us-ascii?q?uUlOrVMNjaPl4F1SCYM3Aq1hgJ9C/cZxA5HTuspCTYASA8TV8=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BNAgA+Zvteh0EkQ7lgHQEBAQEJARIBB?= =?us-ascii?q?QUBQIFKAoMXVQExLI0yiCOaDYFoCwEDAQwbDgQCBAEBhnUCHAcBBDUFDQIQAQE?= =?us-ascii?q?FAQEBAgEDAwQBEwEBAQgNCQgphWIMgjcpg08GAQEsDIE9gzkBgwABr0eBNIMBA?= =?us-ascii?q?QEFgkmDW4E3AwaBOIxoGoIAg3QBLIRBhjCPAxmMbph6gmYEgQeNaYo/DyCCc4k?= =?us-ascii?q?thHQtjVWwUoFrgXdNLkWCaVAZDY4eGoUvgwGFfkABMhodAgYIAQEDCXwTjxYBA?= =?us-ascii?q?Q?= X-IPAS-Result: =?us-ascii?q?A0BNAgA+Zvteh0EkQ7lgHQEBAQEJARIBBQUBQIFKAoMXVQE?= =?us-ascii?q?xLI0yiCOaDYFoCwEDAQwbDgQCBAEBhnUCHAcBBDUFDQIQAQEFAQEBAgEDAwQBE?= =?us-ascii?q?wEBAQgNCQgphWIMgjcpg08GAQEsDIE9gzkBgwABr0eBNIMBAQEFgkmDW4E3Awa?= =?us-ascii?q?BOIxoGoIAg3QBLIRBhjCPAxmMbph6gmYEgQeNaYo/DyCCc4kthHQtjVWwUoFrg?= =?us-ascii?q?XdNLkWCaVAZDY4eGoUvgwGFfkABMhodAgYIAQEDCXwTjxYBAQ?= X-IronPort-AV: E=Sophos;i="5.75,298,1589234400"; d="scan'208";a="353183554" X-MGA-submission: =?us-ascii?q?MDEVOwuNIDIu8LLaJ1bisd/j1MEKln7jOapl+p?= =?us-ascii?q?u+Ib7ZKbYfg2gAEr1+gcS8TLcBl62CtNXZO+pbxZKEJKzQMWdo0s+9QC?= =?us-ascii?q?PFUUEfMhbDa8ktrGRuCFvZcXI4FcNp+45ng37ADPHWdjemSCHWQ06n8v?= =?us-ascii?q?bSu7OqYBREQ09Xl2tCp0BQZQ=3D=3D?= Received: from mout01.posteo.de ([185.67.36.65]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Jun 2020 18:25:47 +0200 Received: from submission (posteo.de [89.146.220.130]) by mout01.posteo.de (Postfix) with ESMTPS id 5B5E116005C for ; Tue, 30 Jun 2020 18:25:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017; t=1593534345; bh=tme0kaCGd9H8yXaagnMb99HpQ0gubAlTcarGQjCNveI=; h=Date:From:To:Subject:From; b=IPqDA79t0h7llipUG5L53VUCehS1nh+ydW5cLZHlAgoqhl808Xm1QEop20I2q8wXu R8HT3ZDkr6K7STe2BVAUh+HrynYhyRiXtmnq4h5I0IA12wbsBP2S4HHMd40z1GlWXS swA3prbtb2h3mdd2amw+B/aZxADiuxbEgmyJitT1+Z/ke48vU8WioZH9D09LUHaTuD 23baaJyLi4ViE3UL6cbe+9az3fNurS3tn7fFlg9oJA8LZd2cqV2zkZiD3HFhMQqKII 5pY+kV+IlZmGELcQDcTfgyfVClFP7Ephy9rImIMAdAwW0ZNIsUJlLGd9ZjeYC8XHX7 xfppen3DyjcrQ== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 49x8qD31sPz6tmZ for ; Tue, 30 Jun 2020 18:25:44 +0200 (CEST) Date: Tue, 30 Jun 2020 17:25:39 +0100 From: Sam Kuper To: "ML caml-list (ocaml discuss)" Message-ID: <20200630162539.itp2j2xpdgyvaeif@posteo.net> Mail-Followup-To: "ML caml-list (ocaml discuss)" MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Subject: [Caml-list] Restrict type to specific chars Reply-To: Sam Kuper X-Loop: caml-list@inria.fr X-Sequence: 18185 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: Dear list, Forgive me for asking a very basic question, but I have not so far been able to find an answer in any of the OCaml books to which I have access, nor in the OCaml documentation or mailing list archive. How does one define a type whose values are restricted to one of some specified chars? E.g. suppose I want to define a type `ab` whose values can only be either 'a' or 'b'. I imagine that should work something like this: # type ab = Ab of char 'a' | Ab of char 'b' ;; type ab = Ab of char 'a' | Ab of char 'b' and thereby give the following functionality: # Ab 'a';; - : ab = Ab 'a' # Ab 'b';; - : ab = Ab 'b' # Ab 'c';; Error: The definition above is essentially pseudo-code to illustrate what I would like to achieve with real, valid OCaml code. (If I knew how to write valid OCaml to achieve this, then I would not be posting this question on the mailing list.) Here are several of my failed attempts at writing OCaml code for what I want to achieve: # type ab = 'a' | 'b';; Error: Syntax error # type ab = char 'a' | char 'b';; Error: Syntax error # type ab = Ab of char 'a' | Ab of char 'b';; Error: Syntax error # type 'a ab = 'a constraint 'a = 'a' | 'b';; Error: Syntax error # type 'a ab = 'a constraint 'a = 'a' | 'a = 'b';; Error: Syntax error How can I actually achieve it? Thank you in advance, Sam -- A: When it messes up the order in which people normally read text. Q: When is top-posting a bad thing? () ASCII ribbon campaign. Please avoid HTML emails & proprietary /\ file formats. (Why? See e.g. https://v.gd/jrmGbS ). Thank you.