From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by walapai.inria.fr (8.13.6/8.13.6) with ESMTP id q45F7eTO007819 for ; Sat, 5 May 2012 17:07:40 +0200 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApcCABNBpU+LEwExe2dsb2JhbABFgx6dWZF9IgEBFiYFIoIMAQEBAwE4AgYBASwLAQQLCxgNIUUSBiWHbgMGBQQHpnOEMQGFBgOJVwaKf4U9Y5cTkhw X-IronPort-AV: E=Sophos;i="4.75,536,1330902000"; d="scan'208";a="142684454" Received: from hera.mpi-sb.mpg.de ([139.19.1.49]) by mail4-smtp-sop.national.inria.fr with ESMTP/TLS/AES256-SHA; 05 May 2012 17:07:34 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mpi-sb.mpg.de; s=mail200803; h=From:To:In-Reply-To:Subject: References:Message-Id:Content-Type:Content-Transfer-Encoding: Mime-Version:Date:Cc; bh=dZEraCoVaWmuIr64oCqDlTuSlyoPRroaNnpG9gW GU7w=; b=aiMw150S6hPHTCJbqteA9NSQvuEdqxMTYUL/qvPG8mkN6tZpHTyguGw YM6jqh1pHzCaVETJJEV55fixDCU9FZ/8LyaWVLavj0B+xk2rO5UibCqsfZeK0Mkt V7H/ixRN7SbELdpD9spKggJVKSlYOHX/a2RzOFv5g6XntvJRSOk0= Received: from srv-00-126.mpi-klsb.mpg.de ([139.19.1.29]:36517 helo=newzak.mpi-klsb.mpg.de) by hera.mpi-sb.mpg.de (envelope-from ) with esmtp (Exim 4.69) id 1SQga3-0007yU-Ch; Sat, 05 May 2012 17:07:33 +0200 Received: from mnch-4d04573f.pool.mediaways.net ([77.4.87.63]:62061 helo=[192.168.178.31]) by newzak.mpi-klsb.mpg.de (envelope-from ) with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.72) id 1SQga2-0006Qp-TZ; Sat, 05 May 2012 17:07:31 +0200 From: Andreas Rossberg To: Goswin von Brederlow In-Reply-To: <8A61AE0A-950A-4AE0-912F-2B7A233C7E8A@mpi-sws.org> References: <87r4uykb09.fsf@frosties.localnet> <8A61AE0A-950A-4AE0-912F-2B7A233C7E8A@mpi-sws.org> Message-Id: Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v936) Date: Sat, 5 May 2012 17:07:29 +0200 Cc: caml List X-Mailer: Apple Mail (2.936) Subject: Re: [Caml-list] A shallow option type I should add that, even if "shallow options" where easy to achieve, they are really a bad idea. You can witness that in "dynamic" languages, where the lack of types leads everybody to just use the equivalent of non-disjoint unions, and thus shallow options. This can lead to an inflation of null-like sentinel values. Consider e.g. JavaScript. Originally, there was `null`. Then they saw the need to distinguish an unbound variable from one bound to null (i.e., distinguish `None` from `Some None`) -- and `undefined` was born. Fast forward, `undefined` has proliferated to all sorts of APIs, and there is a desire to be able to treat it as proper value in many places, e.g. be able to store it in maps. Now there are recurring discussions how to introduce other sentinel values to distinguish "absent" from "mapped to `undefined`". With a properly compositional, algebraic option type this mess cannot arise. /Andreas On May 5, 2012, at 16.48 h, Andreas Rossberg wrote: > On May 5, 2012, at 15.33 h, Goswin von Brederlow wrote: >> What I want is a >> >> type 'a shallow = NULL | 'a (constraint 'a != 'b shallow) > > This is a form of negation, which cannot be expressed in > conventional type systems. Just consider what it should mean in the > presence of type abstraction: if you have > > M : sig > type t > ... > end > > would `M.t shallow` be a legal type? You couldn't decide that > properly without requiring that _every_ abstract type in every > signature is annotated with a constraint saying that it is "not > shallow". > >> I have some ideas on how to implement this in a module as abstract >> type >> providing get/set/clear functions, which basically means I map None >> to a >> C NULL pointer and Some x to plain x. I know x can never be the NULL >> pointer, except when someone creates a 'a shallow shallow and sets >> Some >> None. That would turn into simply None. > > And how do you know that nobody else implements a _different_ type, > say shallow2, that does the same thing? And a third party then > constructs a value of type `int shallow2 shallow`? > > It seems to me that what you want effectively is a special case of > non-disjoint union. Unfortunately, those are known to come with all > kinds of problems, such as not being compositional. > > /Andreas > > > -- > Caml-list mailing list. Subscription management and archives: > https://sympa-roc.inria.fr/wws/info/caml-list > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs >