монада - это контекст, который умеет себя перепаковывать в другой контекст с применением функтора: template<typename T> struct maybe { std::optional<T> value; template<typename F> auto bind(F functor) { if (value.has_value()) { return functor(*value); } return maybe{value}; } }; int main() { maybe<int> x{ 5 }; maybe<int> y = x.bind([](int v) { return maybe<int>{v + 5}; }).bind([](int v) { return maybe<int>{v * 5}; }); std::cout << *y.value; return 0; }
Обсуждают сегодня