Feedback on Sealed Types

Brian Goetz brian.goetz at oracle.com
Sun Nov 17 23:39:01 UTC 2019


And, look what just showed up across the street:


https://github.com/dotnet/csharplang/blob/master/proposals/discriminated-unions.md


On 5/1/2019 11:34 AM, Alan Malloy wrote:
> Yes, that is what I suggest. Two points, though.
>
> First, the sugar benefit is at least a tiny bit larger than you 
> say. You also get to omit instances of <T,U> if the interface is 
> parameterized, as I expect it will often be. I argue you should get to 
> omit public, too: the implementations of a sum should always be 
> public, just as the accessors for a record should be, for the same 
> reason: they are the entire propose of defining the type, and allowing 
> variation here detracts from their semantic value.
>
> And second, I don't know that counting the number of saved 
> characters/tokens is the best way to measure the benefits anyway. An 
> enhanced for loop over an array is not that much shorter than an 
> old-style for loop with an explicit index - in fact it probably saves 
> fewer characters than a couple "implements FooSum". But it's clearly a 
> win because it communicates intent better, and leaves fewer 
> opportunities to make a mistake, either in writing the code or in 
> reading it. Likewise the ability to say in a single token, "this is a 
> closed sum" has legibility benefits aside from just being shorter.
>
> On Wed, May 1, 2019, 6:58 AM Brian Goetz <brian.goetz at oracle.com 
> <mailto:brian.goetz at oracle.com>> wrote:
>
>
>
>>
>>>     I kind a like the intellectual separation between
>>>     - a sealed interface which represent a closed type and requires
>>>     a permit clause and
>>>     - an enum interface which represent a sum type which is sugar on
>>>     top of sealed interface + records.
>>
>
>     To be clear, I think what Alan is suggesting, and what Remi is
>     supporting, is:
>
>      - Make “sealed” the primitive for defining closed types, as
>     originally proposed, and also
>      - Make the following
>
>     enumerated interface Foo {
>         R(X), S(Y);
>
>         STUFF
>     }
>
>     sugar for
>
>     sealed interface Foo
>         permits R, S {
>
>         STUFF
>
>         record R(X) implements Foo { }
>         record S(Y) implements Foo { }
>     }
>
>     Is that correct?
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/amber-spec-experts/attachments/20191117/756a9b41/attachment.html>


More information about the amber-spec-experts mailing list