Probable C# 6.0 features

qznc qznc at web.de
Wed Dec 11 06:13:10 PST 2013


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


More information about the Digitalmars-d mailing list