В настоящее время я изучаю немного haskell и начал выяснять, как работают монады. Так как я нормальный код С++, и я думаю, что образец монады был бы (как я понял, прямо сейчас), быть действительно здорово использовать в С++, например, для фьючерсов и т.д.,
Интересно, существует ли способ реализовать интерфейс или базовый класс для обеспечения правильной перегрузки функций bind
и return
(причины с другим именем, чем возврат для С++) для производных типов?
Чтобы яснее понять, о чем я думаю:
рассмотрим, что у нас есть следующая нечлена-функция:
auto foo(const int x) const -> std::string;
И функция-член bar
, которая имеет разные перегрузки для разных классов:
auto bar() const -> const *Monad<int>;
Если теперь мы хотим сделать что-то вроде этого: foo(someMember.bar())
,
это просто не работает. Поэтому, если вам нужно знать, что возвращает бар, и, например, если он возвращает future<int>
, мы должны вызвать bar().get()
, который блокирует, даже если нам здесь не нужно блокировать.
В haskell мы могли бы сделать что-то вроде bar >>= foo
Итак, я спрашиваю себя, можем ли мы добиться такого поведения на С++, потому что при вызове foo(x)
нам не нужно, чтобы x был объектом, который помещает в поле int
, а в каком классе int
boxed, мы просто хотим применить функцию foo
к типу в штучной упаковке.
Мне жаль, что у меня есть некоторые проблемы с формулировкой моих мыслей на английском языке, так как я не носитель языка.