From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=AWL,SPF_NEUTRAL autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from discorde.inria.fr (discorde.inria.fr [192.93.2.38]) by yquem.inria.fr (Postfix) with ESMTP id C95DDBC69 for ; Thu, 3 May 2007 13:39:03 +0200 (CEST) Received: from wr-out-0506.google.com (wr-out-0506.google.com [64.233.184.231]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id l43BcuCo006926 for ; Thu, 3 May 2007 13:39:03 +0200 Received: by wr-out-0506.google.com with SMTP id l58so596594wrl for ; Thu, 03 May 2007 04:39:02 -0700 (PDT) DKIM-Signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:cc:mime-version:content-type:content-transfer-encoding:content-disposition; b=O1mqKTVPWD52acXf6siVSfdGLxMWEpUOsUX+EUfh1gdTP6KEVUpVBzRniGB3quvlxUiNyELwxXcwiys9isajPkQ6TJ5To+uZ6mKa6Z0vdCpMy6cd+rwfP9BH/g2MqW8TYiaRNK1cCFgJdPMPxhliUSpXexi0x1JjyFSe4q4YnBk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:mime-version:content-type:content-transfer-encoding:content-disposition; b=L+7LOS00RPJrurrzpFUoRFIdaUppKQsaofSY++HtIu0Wm42RJIMhcd0SWsTo+H4i2ekO+me91N7QzPix1kBevaNamWAAIGuor4XMFj9DTMgidbMF8dRhio2x3nYuMtjbeqkt2bbXwHJiazrM9A12ZDtCW9cQQbbh4m6zYUG0/M8= Received: by 10.114.38.2 with SMTP id l2mr632542wal.1178192342278; Thu, 03 May 2007 04:39:02 -0700 (PDT) Received: by 10.114.183.15 with HTTP; Thu, 3 May 2007 04:39:02 -0700 (PDT) Message-ID: Date: Thu, 3 May 2007 13:39:02 +0200 From: "Nicolas Pouillard" To: "Caml List" Subject: Abstract types in the revised syntax Cc: "Till Varoquaux" , "=?UTF-8?Q?G=C3=A9rard_Huet?=" , "Benoit Razet" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline X-j-chkmail-Score: MSGID : 4639C9D0.002 on discorde : j-chkmail score : X : 0/20 1 0.000 -> 1 X-Miltered: at discorde with ID 4639C9D0.002 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; syntax:01 syntax:01 existential:01 existential:01 parser:01 syntaxes:01 bug:01 parser:01 ocaml:01 sig:01 sig:01 ctyp:01 compilation:01 cvs:01 unbound:01 Hello, This message concern the few people that use the revised syntax :) In the revised syntax, abstract types are expressed by defining them with an unbound type variable: (* Original *) type t;; (* Revised *) type t = 'a; The motivation is that looks like an existential type, which is a way of seeing abstract types. However I found this motivation misapplied since it doesn't look like an existential type, there is no exists keyword?!? (type t = exists 'a. 'a;) It's like a hot-dog without sausage?!? In fact, consequences of that choice are worst. If forces the parser/printer to do some semantical operation to convert back and forth between syntaxes. type t 'a = 'a; (* not abstract *) type t 'a = 'b; (* abstract *) It was considered acceptable, since the test for the freeness of a single type variable seemed simple because very local. Indeed only the list of parameters was consulted to compute the freeness of the type variable. It seems very weak since highly dependent of future evolution of the language. Nowadays it's no longer sufficient. Constraints can be added with a type declaration to constrain the type of parameters. type c 'a = 'b constraint 'a = < b : 'b; .. >; (* Thanks to Till Varoquaux for it's bug report. *) Clearly I don't want to push that wrong choice further by making more semantic analysis in the parser/printer. So I revert back to << type t; >> for abstract types. Now, what's the new representation for abstract types. OCaml use a option type, where None represent the abstract type. We can't afford that, since we want a concrete syntax for everything. However we have a nil type that can be used as a default case (for lists of types or optional types). <:sig_item< type t >> === <:sig_item< type t = $ <:ctyp<>> $ >> Not that this will also concern abstract module types. Alas, this will affect existing code using the revised syntax, but will be easily caught at compilation. >>From a pragmatic point of view, a grep to show the usage of such types: grep -E "^[ \t]*type.*=[ \t]*'[^ \t]*[ \t]*;[ \t]*$" **/*.ml* Feel free to share your mind on that subject. The change is not yet applied to the CVS. Best regards, -- Nicolas Pouillard