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
なんという劇的ビフォーアフター。