読者です 読者をやめる 読者になる 読者になる

ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

C#にもMaybeモナドがほしい

これ超ほしいと思います。

まずはMaybeモナドの説明から

お察しの通りHaskllにあるものです。Maybeとは「必ず値を返さないといけない」宿命を背負ったHaskellの関数が、「値がないかもしれない」という値を返すために用いる型で、
値がある場合はJust a、ない場合、つまりC#でいうところのnullはNothingという値になります。こういう「文脈を持った値」のことをファンクターといいます。
そして、ある値を受け取るとファンクターに入れて返す関数を適用できるような仕組みを持っているファンクターをモナドといいます。要はこういう感じのことができるんです。

Maybe x >>= fuga >>= hoge >>= piyo >>= homu ... --途中でNothingになってもちゃんと評価される

Rubyにはすでに似たようなのがある

ActiveSupportで定義されているtryというメソッドです。これを使うと、

x.try(:hoge).try(:fuga).try(:piyo).try(:homu) # 途中でにnilになっても例外が起きない

というふうにnilになるかもしれない中間地点を特に気にせず最終結果を得ることができます。これがもしC#だったら、

if(x != null)
{
    var y = x.Hoge;
    if(y =!= null)
    {
        var z = y.Fuga;
        if( //やってられないので省略

私はこんなの書きたくないです。

実はC#6.0で来るんじゃないかといわれている

あくまで予想らしいですが、この記事の数あるエキセントリックな予想に交じって、このMaybeモナドっぽい書き方が検討されています。「Monadic null checking」といいたいこともそんな感じ。解説によると、これはGroovyの記法から参考にしたものだそうです。

Before

if (points != null) {
    var next = points.FirstOrDefault();
    if (next != null && next.X != null) return next.X;
}   
return -1;

After

var bestValue = points?.FirstOrDefault()?.X ?? -1;
Probable C# 6.0 features illustrated » DamienG

なんという劇的ビフォーアフター