動機: 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
実装に関する詳しい解説は、面倒なので、覚えていたら明日以降にでも。