C++ で Maybe モナド

動機: C++ で Haskell の Either っぽい何かを作ってみた。 - 野良C++erの雑記帳


せっかく Either 作ったんだから Maybe モナドも作ろうぜ、という話。
まず Boost には、既に Maybe に相当する Boost.Optional が存在するので、
そいつをモナドの >>= に対応させてやればよい、
という考え方が最もストレートなものであり、
実際、そういう方針で書かれたコードは既に存在してたりします。
(例: C++でMaybeモナド - Faith and Brave - C++で遊ぼう


そこで、少し発想を変えてみることにしました。
まず、 Haskellモナドを、そのまま C++ に持ち込むのは、やはりキモいです。
C++ には暗黙の型変換という文化があるので、その恩恵をフルに活用出来ないか。


また、 C++ における Maybe 相当の機能は、果たして Boost.Optional だけなのでしょうか。
少し考えると、実はポインタもまた Maybe であることが分かります。
だとすれば、ポインタであっても >>= を使えるようにしたら、面白いのではないか。
当然、生ポインタだけではなく、スマートポインタでも使えたら楽しそうです。


また、 C++Haskell と違って、気軽に関数を合成出来ません。
m >>= return.f >>= g とか書きたくても、うまく書けないのです。
そこで、 C++ の暗黙変換機能をフルに活かし、
もし >>= に渡す関数が Maybe ではない値を帰す場合には、
暗黙で boost::optional で包んでやる、という戦略で作れば、
かなり使い勝手の良い物が作れるのではないか。


と、そういう方針で作ってみた俺々 Maybe モナドが、こちらです:
http://ideone.com/fRvnm


実装に関する詳しい解説は、面倒なので、覚えていたら明日以降にでも。