OT: (C#) Type Unions for C#

Quirin Schroll qs.il.paperinik at gmail.com
Tue Aug 13 11:23:07 UTC 2024


On Monday, 12 August 2024 at 10:37:08 UTC, Richard (Rikki) Andrew 
Cattermole wrote:
> On 12/08/2024 10:32 PM, Quirin Schroll wrote:
>> Tag-based type unions where order matters, duplication matters 
>> (different tags), they do not auto-inline, and the empty one 
>> is at definition site its own type.
>
> There is also tag based unions where order doesn't matter.
>
> I.e. hashed tag name/tag type.
>
> This is the one I propose, as it allows changing the sumtype 
> elements without having to perform a match.

What I intended was writing “Non-tag-based type unions where 
order matters” etc. where you extract by index.

For tag-based unions, you’re right, order should not matter, same 
as order of data members in a `union` type doesn’t matter.

The gist is: There are actually four kinds of type sums: 
Plus-like, list-like, and ad-hoc and user-defined tagged.

Examples:
- JSON values are reasonable as a plus type: `alias Json = double 
+ string + bool + Json[] + Json[string] + typeof(null)`.
- Value exceptions are list-like: `Result = Expected ~ 
Unexpected1 ~ Unexpected2`. An unexpected type might be identical 
with `Expected` but semantically different. Even two unexpected 
results might be same-type but semantically different. If that’s 
not intended, one can use `Expected ~ (Unexpected1 + 
Unexpected2)`.
- Most high-level user-defined sum types would be tag based.

I implemented something like that some time ago in a library. 
What the library does is provide a mixin template so that users 
can create their own tag-based sum types. What it didn’t offer, 
though, was ad-hoc tag based unions, probably because of limiting 
syntax. I didn’t like seeing `Sum!(int, "x", long, "y")` in error 
messages because those things get long quickly. For the mixin 
template, I use an “implementation struct” that provides the 
types and members.


More information about the Digitalmars-d mailing list