Здравствуйте, Ikemefula, Вы писали:
I>"без монад" значит что эти же обязанности размажешь по коду ровным слоем. Более того, функция собственно мало чем отличается от монады.
Да я не об этом. Вот смотри, допустим есть такая функция:
template<typename T> auto ComplexFunc(T t)->decltype(apply(h, apply(g, apply(f, t)))){ return apply(h, apply(g, apply(f, t))); }
Так вот она всегда вернёт значение y=h(g(f(x))), кем бы у нас не был x. Это могут быть "голые" значения, могут быть какие-то функторы/монады, а могут вообще какие-нибудь stl коллекции. Причём функции f, g, h не перегруженные, а есть только в одном экземпляре, работающем с "голыми" значениями. И естественно имеем тут ноль накладных расходов, в отличие от решения "а сделаем ка всё монадой на будущее, на всякий случай".