Relaxed assignment conversions for sealed types

Remi Forax forax at
Tue Nov 24 14:45:48 UTC 2020

> De: "Maurizio Cimadamore" <maurizio.cimadamore at>
> À: "Brian Goetz" <brian.goetz at>, "Tagir Valeev" <amaembo at>
> Cc: "amber-spec-experts" <amber-spec-experts at>
> Envoyé: Mardi 24 Novembre 2020 15:10:35
> Objet: Re: Relaxed assignment conversions for sealed types

> On 31/10/2020 23:30, Brian Goetz wrote:

>>> On Oct 25, 2020, at 10:06 AM, Brian Goetz < [ mailto:brian.goetz at |
>>> brian.goetz at ] > wrote:

>>> To make it clear that I'm not talking about the annoyance of typing the cast,
>>> let's pretend I'm suggesting to write it like this:

>>> BarImpl bi = (__static BarImpl) b;

>> Pulling on this string some more — I think there’s a connection between this
>> feature and total statement switches. We’ve been looking for a way to make
>> statement switches total, and here, what we’re looking for is a way to make
>> _casts_ total. Which suggests this is one feature, not two. So perhaps:

>> switch-total (x) { … } // a switch, but with added bonus totality checking

>> BarImpl b = (total BarImpl) bar // a cast, but with added bonus totality
>> checking

> I agree the latter is a common enough problem when writing implementation code
> where you have a sealed hierarchy and you know there's only one impl (Foreign
> API has this all over the place).
You think that not typechecking that BarImpl is the sole implementation of Bar everytime you write a cast is a problem ? 
I don't know for the Foreign API, but having a static helper method that takes a BarImpl and returns a Bar is not enough ? 

BarImpl impl(Bar bar) { 
return switch(bar) { case BarImpl impl -> impl; }; 

Or am i missing something ? 

> To throw in the mix - how is some kind of pattern match assignment (we referred
> to as a "let expression" in some of the earlier docs [1]) would change the
> picture here? In other words, maybe it's overloading `=` which is at odds here,
> and we need to make it more explicit that this is more akin to an
> extraction/match?
The match operator (as in let ... match), is more or less what C# as done by using switch as an operator, 
BarImpl impl(Bar bar) { 
return bar switch { case BarImpl impl -> impl; }; 

It's still a possible syntax for total-switch. 
Anyway, it doesn't answer to your question, it seems you want something in the middle in between a cast and a switch, let impl = bar; 

> Maurizio

> [1] - [ |
> ]

>> Obviously we can use another word besides `total`, but it’s a pretty good straw
>> man.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the amber-spec-experts mailing list