今日 id:uskz に会ったときに「C++でもMaybeモナドできますよ」って言われたので調べたらこんなのあった
#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;