Реализация Haskell's Maybe Monad в c ++ 11
Я пытаюсь реализовать монаду Maybe от Haskell, используя лямбда-функции в C ++ 11 и шаблоны. Вот что у меня пока
#include<functional>
#include<iostream>
using namespace std;
template<typename T1>
struct Maybe
{
T1 data;
bool valid;
};
template<typename T1, typename T2>
Maybe<T2> operator>>=(Maybe<T1> t, std::function < Maybe<T2> (T1)> &f)
{
Maybe<T2> return_value;
if(t.valid == false)
{
return_value.valid = false;
return return_value;
}
else
{
return f(t.data);
}
}
int main()
{
Maybe<int> x = {5, true};
Maybe<int> y = {29, false};
auto z = [](int a) -> Maybe<int>
{
Maybe<int> s;
s.data = a+1;
s.valid = true;
return s;
};
Maybe<int> p = (x >>= z);
Maybe<int> q = (y >>= z);
cout<<p.data<<' '<<p.valid<<endl;
cout<<q.data<<' '<<q.valid<<endl;
}
Когда дело доходит до фактического>>=
вызов, я получаю сообщение об ошибке компилятора, что не найдено совпадений для>>=
оператор. Мое понимание лямбда-функций в C ++ 11 меня подводит?