Реализация Haskell-монады Maybe в 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;
}    

Когда дело доходит до фактического вызова >>=, я получаю сообщение об ошибке компилятора о том, что для оператора >>=не найдено совпадений. Подводит ли меня мое понимание лямбда-функций С++ 11?

23
задан Xeo 13 March 2012 в 21:45
поделиться