14 posts were merged into an existing topic: A small implementation of Algebaric Data Types

If anyone wants to play around with the proposal, I have a prototype implementation here: GitHub - tmke8/cpython at union-match-args It’s absolutely not ready to be submitted as a PR, but it works:

```
Python 3.13.0a5+ (heads/union-match-args:7524bcf619, Apr 4 2024, 13:46:50) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from collections import namedtuple
>>> A = namedtuple('A', ['x'])
>>> B = namedtuple('B', ['x', 'y'])
>>> AB = A | B
>>> AB.__match_args__
('x',)
>>> ab = A(0)
>>> match ab:
... case AB(x):
... print(f"AB({x})")
...
AB(0)
```

Showing nice error messages turned out to be quite tricky though, so maybe this isn’t the right proposal after all.

1 Like

To clarify, `TaggedUnion`

is a sum of `TypeA`

and `TypeB`

, not of `TagA`

or `TagB`

. The union of two *distinct* wrapper types is a proper sum. `T2 = TagA | TagA`

would not be a true sum, as there’s no way to distinguish between “left” and “right” `TypeA`

values.

1 Like