template< template class M > class Monad{ public: template virtual M Return(A a) = 0; template virtual M Bind(A a, std::function(A)> f); };