C++でMaybeモナド

今日 id:uskz に会ったときに「C++でもMaybeモナドできますよ」って言われたので調べたらこんなのあった


Maybe monad in C++

#include <boost/variant.hpp>

class Nothing {}; 

template <class T>
class Just {
public:
    T val;

    Just(T x) : val(x) {}
};

template<class T, class F>
boost::variant<Nothing, Just<T> > 
    operator>>=(boost::variant<Nothing, Just<T> > x, F f)
{
    return (boost::get<Nothing>(&x)==NULL) ?
                f(boost::get<Just<T> >(x).val) : Nothing();
}

template <class T>
boost::variant<Nothing, Just<T> > Return(T x)
{
    return Just<T>(x);
}

boost::variant<Nothing, Just<int> > inc(int x)
{
    return Return<int>(x+1);
}

int main()
{
    boost::variant<Nothing, Just<int> > foo,bar;
    
    foo = Just<int>(9);
    (foo >>= inc) >>= inc; 

    bar = Nothing();
    (bar >>= inc) >>= inc;
}


これで何か作りたいなー。



※追記:
Maybeモナドというのは、簡単に言えば、失敗するかもしれない処理を連続して書き、失敗したらその後の処理はしない、というものです。

こう書くよりは

if (!A)
    return;
if (!B)
    return;
if (!C)
    return;

こう書きたいという動機

A >>= B >>= C;