Next up for patterns: type patterns in switch
Brian Goetz
brian.goetz at oracle.com
Tue Aug 11 13:57:36 UTC 2020
> - i don't think that framing the problem we have in term of null
> haters / null friends is productive.
It may not be productive, but it is one of the elephants in the room.
Some people sometimes take a hostile view of null ("We should prevent
stream elements from being null!"), and, while this is often motivated
by the best of intentions, it is a bias we need to be aware of.
> - match :: (Pattern t) u -> Maybe t, the railway design pattern as
> coined by Scott Wlaschin[1], means that __each__ matcher is able to
> decide what to do with null, so it's a more lax model as the one we
> are working on.
Seems like exactly the model we are working on. Some patterns can match
null (total type patterns, any patterns, null constant pattern) and some
cannot (deconstruction patterns, non-null constant patterns.)
Eventually, there will be a way to write patterns in Java code (e.g.,
deconstruction patterns for arbitrary classes), but we can still make
the "null OK / null not OK" decision for these entire categories at
once, so humans and compilers can reason about them.
> There is a way to see a switch as a cascade of instanceof and to allow
> null,
Herein lies danger, as both `switch` and `instanceof` have pre-existing,
somewhat accidental null opinions. But I agree that it is a good goal
that switches and if-else chains of instanceof tests on the same target
be refactorable to each other to the extent possible.
> This is almost the same semantics as the one you are proposing but
> instead of the notion of totality, being the last case is enough to
> accept null.
... but what if the switch isn't total? I can have
switch (o) {
case Integer i: ...
case String s: ...
// no default, no total pattern
}
and it would be quite surprising to randomly shove nulls into the last
case. This would prevent the cases from being reordered even though
they have no dominance ordering. The reason the last case is special in
the examples we've given so far is ... wait for it ... THEY ARE TOTAL.
It would be a compiler error to have any more cases after them. They
are intrinsically catch-alls.
> I prefer this semantics, because it's local, the last case allows
> null, it doesn't depends on the type of v or the relationship between
> A and B.
This proposal seems entirely motivated by "let's have a really simple
rule", rather than based on principles of what actually should happen in
real programs or what programs should be expressible. And, regardless
of motivation, it is surely the wrong answer.
More information about the amber-spec-experts
mailing list