On 11/19/2013 12:55 AM, Stretto wrote:
F# now has Discriminated Unions:

http://msdn.microsoft.com/en-US/library/dd233226.aspx

Would it be possible to have something similar in D?

Sure. DMD still refuses to compile my proof of concept implementation though:

https://d.puremagic.com/issues/show_bug.cgi?id=10431
https://d.puremagic.com/issues/show_bug.cgi?id=11558

In essence, the following is easily possible in theory:

mixin ADT!q{
 List(T):
 | Nil
 | Cons T List!T
};

auto list(R)(R r) if(isInputRange!R){
    if(r.empty) return Nil!(ElementType!R);
    auto f = r.front;
    r.popFront();
    return Cons(f,list(r));
}

size_t length(T)(List!T l){
    return l.match!(
        ()=>0,
        (x,xs)=>1+length(xs)
    );
}

Reply via email to