Algebraic Data Types in D?
Andrei Alexandrescu via Digitalmars-d
digitalmars-d at puremagic.com
Thu Jul 31 18:26:20 PDT 2014
On 7/31/14, 5:35 PM, Timon Gehr wrote:
> On 07/31/2014 06:23 PM, Andrei Alexandrescu wrote:
>> On 7/31/14, 6:03 AM, w0rp wrote:
>>> On Thursday, 31 July 2014 at 11:42:21 UTC, Remo wrote:
>>>> http://tech.esper.com/2014/07/30/algebraic-data-types/
>>>>
>>>> D already has product type it is struct.
>>>> But D lacks sum type also called tagged-union.
>>>>
>>>> Do you think it would be possible to add something like this to D2 ?
>>>
>>> There is a library solution for this in the standard library.
>>>
>>> http://dlang.org/phobos/std_variant.html#.Algebraic
>>>
>>> It doesn't handle recursive types at the moment, like alias Foo =
>>> Algebraic!(Foo[]). Apart from that, it should be what you are looking
>>> for.
>>
>> alias Foo = Algebraic!(This[]);
>>
>> Andrei
>
> alias Foo = Algebraic!(int,Algebraic!(Foo[],double)[]);
Good point! That's why I'd submitted this at some point:
https://issues.dlang.org/show_bug.cgi?id=9608
It should be possible to achieve alpha replacement of This with the
needed type at any level inside a composite type.
> There is also this kind of approach:
>
> mixin ADT!q{
> List(T):
> | Nil
> | Cons T List!T
> };
Interesting! Is there code available for that?
> Of course, product types ("tuples") and sum types ("tagged unions") and
> recursive types are elementary enough to be proper language features in
> one way or another with all the syntactic convenience that yields for
> pattern matching.
Well one other way to look at it is that striving to do things in a
library pushes introspection forward.
I do agree tagged unions should be pushed into the language; they'd help
the GC.
Andrei
More information about the Digitalmars-d
mailing list