Тип конструктора:
template< typename T > T*;
Оператор подразделения
template< typename T > T* unit( T /*or T&*/ t ) { return &t; }
Оператор связывания
template< typename A, typename B >
B* bind( A a, std::function<b*(a)> f )
{ return a ? f(a) : nullptr; }
Законы монады
bind( unit(x), f ) === f(x)
bind( bind(x, f1), f2 ) === auto a = f1(x); auto b = f2(a); return b;
Указатель на T является монадой над ссылками T, а не над T; необязательный T является монадой над T.
Это различие важно, если оно отсутствует в функциональных языках. Ссылки имеют время жизни, а указатели следуют за этим временем жизни.
Я согласен с тем, что отсутствие функций, соответствующих традиционным именам, является неважной деталью; векторное пространство остается векторным пространством, даже если оператор двоичного сложения не обозначен +
До тех пор, пока это доступно из контекста.
Других решений пока нет …