Probable C# 6.0 features

Ary Borenszweig ary at esperanto.org.ar
Wed Dec 11 07:10:50 PST 2013


On 12/11/13 11:32 AM, Robert Clipsham wrote:
> On Tuesday, 10 December 2013 at 23:53:25 UTC, Ary Borenszweig wrote:
>> On 12/10/13 5:35 PM, Namespace wrote:
>>> I love Monadic null checking. Would be great if D would have it.
>>
>> What does a monad have to do with that?
>>
>> (just out of curiosity... BTW, the other day I friend tried to explain
>> me monads and he realized couldn't understand them himself)
>
> Monads suffer from the same problem algebra, templates and many other
> things do in that they have a scary name and are often poorly explained.
>
> They way I like to think of monads is simply a box that performs
> computations. They have two methods, bind and return. return lets you
> put a value into the box, and bind lets you call some function with the
> value that's in the box. Probably the simplest example is the maybe
> monad ("monadic null checking"). The idea is to let you change something
> like this:
> ----
> auto a = ...;
> if (a != null) {
>      auto b = a.foo();
>      if (b != null) {
>          b.bar();
>          // And so on
>      }
> }
> ----
> Into:
> ----
> a.foo().bar();
> ----
>
> Here, the bind and return methods might look something like:
> ----
> // "return" function
> Maybe!Foo ret(Foo f) {
>      return just(f);
> }
> auto bind(Maybe!Foo thing, Foo function(Foo) fn) {
>      if(thing) {
>          return ret(fn(thing));
>      }
>      return nothing();
> }
> ----
> There are two functions here for getting instances of maybe - nothing
> and just. Nothing says "I don't have a value" and just says "I have a
> value". The bind method then simply says "if I have a value, call the
> function, otherwise just return nothing". The code above would be used
> as follows:
> ----
> bind(bind(a, &foo), &bar);
> ----
> With a bit of magic you can get rid of the overhead of function pointers
> and allow it to work with other function types, but it shows the general
> concept - wrap up the values, then use bind to chain functions together.
>
> The ?. operator mentioned in the article is simply some syntactic sugar
> for a monad, hence "monadic null checking".

Thanks for the explanation. I think I understand monads a bit more now. :-)

However, isn't it too much to call the "?." operator "monadic null 
checking"? I see it as just syntax sugar:

foo?.bar

is the same as:

(temp = foo) ? temp.bar : null

And so:

foo?.bar?.baz

it the same as:

(temp2 = ((temp = foo) ? temp.bar : null)) ? temp2.baz : null

By the way, in Crystal we currently have:

class Object
   def try
     yield
   end
end

class Nil
   def try(&block)
     nil
   end
end

You can use it like this:

foo.try &.bar
foo.try &.bar.try &.baz

Not the nicest thing, but it's implemented as a library solution. Then 
you could have syntactic sugar for that.

Again, I don't see why this is related to monads. Maybe because monads 
are boxes that can perform functions, anything which involves a 
transform can be related to a monad. :-P


More information about the Digitalmars-d mailing list