[pattern-switch] Totality
Brian Goetz
brian.goetz at oracle.com
Wed Aug 26 19:32:21 UTC 2020
>
>> We can easily generalize the definition of totality to a set of
>> patterns. In this case, we can handle sealed types and enums:
>>
>> - Let E be an enum type. The set of patterns { C1 .. Cn } is total
>> on E with remainder { null, E e } if C1 .. Cn contains all the
>> constants of E.
>>
>> Observation: that `E e` pattern is pretty broad! But that's OK; it
>> captures all novel constant values, and, because the explicit cases
>> cover all the known values, captures only the novel values. Same for
>> sealed types:
>>
>> - Let S be a sealed abstract type or interface, with permitted
>> direct subtypes C*, and P* be a set of patterns applicable to S. If
>> for each C in C*, there exists a subset Pc of P* that is total on C
>> with remainder Rc, then P* is total on S with remainder { null }
>> union \forall{c \in C}{ Rc }.
>
> I think there should not be set braces around that last occurrence of
> “Rc”.
Right.
> I assume that this use of syntax “T = U | V” is meant to imply that T
> is a sealed type that permits U and V.
Right.
>
>> { Circle, Rect } total on Shape with remainder { Shape, null }
>>
>> -> { Box(Circle), Box(Rect) total on Box<Shape> with remainder {
>> Box(Shape), Box(null), null }
>>
>> -> { Bag(Circle), Bag(Rect) total on Bag<Shape> with remainder {
>> Bag(Shape), Bag(null), null }
>>
>> -> P* total on Container<Shape> with remainder {
>> Container(Box(Shape)), Container(Box(null)), Container(Bag(Shape)),
>> Container(Box(Shape)), Container(null), null }
>
> I believe that, in this last remainder, the second occurrence of
> `Container(Box(Shape))` was intended to be `Container(Bag(null))`.
Yes, cut and paste bug. This IDE needs better inspection helpers!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/amber-spec-experts/attachments/20200826/e92e9a10/attachment.htm>
More information about the amber-spec-experts
mailing list