On Friday, 10 August 2018 at 12:35:18 UTC, Everlast wrote:
On Thursday, 9 August 2018 at 15:56:12 UTC, Paul Backus wrote:
On Wednesday, 8 August 2018 at 20:54:13 UTC, Paul Backus wrote:
SumType is a generic sum type for modern D. It is meant as an alternative to `std.variant.Algebraic`.

Version 0.5.2, with fixes for the bugs reported in this thread, is now available. Thanks to vit for their detailed feedback!

In order to avoid spamming the newsgroup, I'd like to encourage everyone to submit further bug reports, feature requests, etc. as Github issues at https://github.com/pbackus/sumtype/issues

It would be nice if some actual examples could be given. The help on dub is a bit confusing because the the code is not complete.

Also, I'm curious how one can handle a collection of types with match?

Suppose I have SumType!(int, float, string)

and I wanted a generic match on int and float. Something like

(int | float _) => would be awesome, but that is invalid.

Of course, there are work arounds but the goal is for simplification in a canonical way.

One way would be to be able to call other handlers directly:

(int _) => { return match.float(_); }
(float _) => { ... }

which, say, calls the float delegate. This is just "chaining" but is a nice universe syntax and is good if it can be implement(with inlining occurring).

Another way would be to allow for "sub-SumType'ing":

alias X = SumType!(int, float, string);

(X.SubType!(int, float) _) { ... }

or whatever, again, a few ways one can go about this.

Also, a full algebra would be nice ;)

alias X = SumType!(int, float, string)
alias Y = SumType!(complex, vector)

alias Z = SumType.Union(X,Y);

Z is a "super type" as could have been expressed as

alias Z = SumType!(int, float, string, complex, vector).

except, of course, Z would be typed in terms of X and Y.

The difference is that Z is compatible with X and Y. But this might require a little work because something like Z.X is not the same as X due to the fact that X's typeinfo(an index value?) cannot represent Z(it would be nice if it could but I think it might be fragile to do so unless hashing solves the problem).

Then intersection can also be defined:

SumType.Intersect(X,Y) = SumType!(Null) = null;

But if Y had a string then

SumType.Intersect(X,Y) = SumType!(string); (which should reduce to string)

But the problem is that, a string in X and a string in Y may have no relationship programmatically(one may encode a series of bits for, say, compression and the other an error string). This then requires some way to know which type is being acted on(X or Y) as so the in sub-types can be properly interpreted.


If one notices, this is similar to inheritance in that union is related to derivation and intersection to reduction. The notions, if they can be consistently defined, allows one to build type structures that are hierarchically based and parallel classes. In fact, classes could be seen as a product of SumTypes on single elements:

alias C = ProdType!(SumType!string, SumType!int);

C then would act like a class with a string and int field with the functionality of both combined and

class Q;
alias D = ProdType!(SumType!float, C, Q);

would be a derivation from C and Q and adding a float member.

Of course, this would be a lot of work and require mathematical consistency and not offer much over the current method(in which ultimately it would be equivalent to I believe) but it does provide completeness. Of course, I suppose if we were to go down that path we'ed then require a full on algebraic system so we could do stuff like exponentiation, etc ;)












Reply via email to