Sum Type by Struct
Meta
jared771 at gmail.com
Thu Sep 12 16:55:35 UTC 2024
On Thursday, 12 September 2024 at 11:28:56 UTC, Richard (Rikki)
Andrew Cattermole wrote:
> In this proposal I propose a third sumtype design, one in which
> it is based upon structs.
> Paul's design is based upon union's, and Walter's is on enum's.
> This completes the triple axis that sumtypes live on.
>
> Latest:
> https://gist.github.com/rikkimax/35b5673554e8d15fc3710082953989fb
>
> Current:
> https://gist.github.com/rikkimax/35b5673554e8d15fc3710082953989fb/bdf1ff8fd342c248bd42902d4cf032ab99496449
>
> Matching is supported by this proposal, with full capability.
> It uses DIP1048, along with another proposal in the development
> forum the
> [member-of-operator](https://forum.dlang.org/post/xtmwtmkhmufpzeyrsxsb@forum.dlang.org).
>
> Tag names are optional, if you use the member-of-operator to
> define an element you cannot provide a name as it is already
> unique.
>
> The layout of the sumtype is variable size, allowing for copy
> constructors, destructors and no value (if size zero).
>
> There is also one other unique behaviour, the ability to act as
> an ``alias this``, when only one element is in the constraint
> set. Very useful behaviour for returning values with a match.
>
> I do have three core goals in this design:
>
> 1. Make it very easy to swap from a library design to a
> language sumtype.
> 2. Allow value type exceptions to be baked by this, and to
> offer catch all.
> 3. Easy for non-D programmers to learn and utilize this as a
> feature without changing their mental model. As a concept this
> has changed very little over the last 50 years, we do not need
> to invent a new set of design parameters.
>
> ```d
> sumtype S = :None | int;
> sumtype S2 = int | bool;
>
> S1 s1;
> S2 s2 = s1.match {
> (:None) {
> if (random() > 0.5)
> return true;
> else
> return 2;
> };
>
> (int v) {
> return v;
> };
> };
> ```
>
> To access an element value in ``@system`` code use casting.
> Assigning is ``@safe``.
>
> ```d
> sumtype S = int i | bool;
> S s;
>
> cast(:i)s = 2;
> assert(cast(:i)s == 2);
> ```
Why is this member of operator necessary? What advantages does it
have compared to matching based on type, like the current library
sumtypes do? How is the following:
```D
alias None = typeof(null);
sumtype S = None | int;
sumtype S2 = int | bool;
S1 s1;
S2 s2 = s1.match {
(None) {
if (random() > 0.5)
return true;
else
return 2;
};
(int v) {
return v;
};
};
```
Improved by the member of operator?
More information about the dip.ideas
mailing list