On Wednesday, 11 December 2013 at 13:40:22 UTC, Robert Clipsham wrote:
On Tuesday, 10 December 2013 at 20:35:08 UTC, Namespace wrote:
I love Monadic null checking. Would be great if D would have it.

Doesn't need to be a language feature - you can implement it as a library type. Here's a quick hacked together maybe monad:

----
import std.stdio;

struct Maybe(T)
{
    private T val = null;

    this(T t)
    {
        val = t;
    }

    auto opDispatch(string method, U...)(U params)
    {
alias typeof(mixin("val." ~ method ~ "(params)")) retType;
        if (val) {
mixin("return Maybe!(" ~ retType.stringof ~ ")(val." ~ method ~ "(params));");
        }
        return nothing!retType();
    }
}

Maybe!T just(T)(T t)
{
    return Maybe!T(t);
}

Maybe!T nothing(T)()
{
    return Maybe!T();
}

class Foo
{
    Bar retNull()
    {
        writeln("foo null");
        return null;
    }

    Bar notNull()
    {
        writeln("foo not null");
        return new Bar();
    }
}

class Bar
{
    Foo retNull()
    {
        writeln("bar null");
        return null;
    }

    Foo notNull()
    {
        writeln("bar not null");
        return new Foo();
    }
}

void main()
{
    auto maybe = just(new Foo);
    maybe.notNull().notNull().notNull().retNull().notNull();
}

----

Now define map,bind,join. It quickly gets ugly.

https://bitbucket.org/qznc/d-monad/src/5b9d41c611093db74485b017a72473447f8d5595/generic.d?at=master

Reply via email to