Re: “Deriving” functionality for classes and pattern matching on LHS of assignment?
Brian Goetz
brian.goetz at oracle.com
Thu Dec 5 15:15:46 UTC 2024
On 12/5/2024 4:34 AM, vab2048 wrote:
> Hi Amber team,
>
> I was wondering about the future of two different features and thought I would just ask the mailing list.
>
> The first feature: deriving instances.
>
> Haskell allows type declarations to derive instances for certain type classes (Eq, Ord, Enum, Bounded, Show, and Read).
>
> Is it possible to get some sort of equivalent for java classes which would allow us to specify to the compiler to auto derive some code. I am thinking about easily auto-generating a toString, equals, hash code etc? We already have a form of this for records, and so bringing it to classes would make a logical next step.
The strict equivalent of this is records: in Haskell, you don't get any
control over how to derive type classes such as Eq and Show, and
similarly for records: the one the compiler gives uses all the state.
So in some sense, mission accomplished. But that's not really what
you're asking. What you're asking is for an _arbitrary class_ -- not
just a `data` type -- to be able to get these somehow.
We did several extensive explorations of various options, but they all
fail at the same root: that unless you declare your class in a special
way where where these things all use all the state components (which is
how records do it), the user will surely have some opinion about which
field values feed into the derivation (and possibly how -- e.g., are
arrays handled by identity or by content?) And not all deriviations
will want to use the same set of field values. (And OMG what about
mutability. And for accessors, what about name selection? Etc etc.)
When you sketch it out, you end up with something that is basically a
syntax generator with about the same (enormous) programming model
surface as typical "bean" generators -- which is to say, a mess, and a
mess for which no solution will be complete enough. (Our mantra for
records was that zero was the only acceptable number of "knobs", because
once there is one knob, there are arbitrarily many.)
So while it may sound like a "logical next step", the complexity goes up
by orders of magnitude, and you lose the best thing about records at the
same time -- that record-ness is a semantic, not syntactic, construct.
So I am skeptical about that step.
> The second feature: pattern matching on LHS of assignment.
>
> Suppose we have this record type:
>
> record Color(byte red, byte green, byte blue) {}
>
> and a static factory method “someFactory” which returns a Color.
>
> Are there any plans to allow us to pattern match at the point of assignment like so:
>
> Color(byte red, byte green, byte blue) color = someFactory();
>
> This would be a great addition to pattern matching.
Imperative pattern matching is reasonable and well understood, but (a)
it is not yet the highest-leverage remaining pattern matching feature
(and so remains lower on the queue) and (b) still has several rough
edges to work out. There are actually two versions of imperative
pattern matching that people might want: one which is "total" (it is a
compile error to try to deconstruct a target with a pattern that is not
exhaustive, and one which is "partial" (one that just throws on
non-match, as if you had "cast" the target to the pattern.) So this is
on the back burner for now.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20241205/49f0d1b5/attachment.htm>
More information about the amber-dev
mailing list