Реализация 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 меня подводит?

Ответы на вопрос(1)

Ваш ответ на вопрос