Здравствуйте, Sinclair, Вы писали:
S>И? Дальше-то что? Ну вот написал Петя такую функцию Apply для своего optional. А мне-то как этим пользоваться?
S>Вот у меня был код на обычных big_integer:
S>S>for(int i=0; i<array.length(); i++)
S>{
S> if (array[i]*array[i] > limit))
S> sum+=array[i]*array[i];
S>}
S>
S>Я решил заменить их на option<big_integer>. Как теперь будет выглядеть мой код?
Хм, очень странный пример, если смотреть с твоих позиций. Потому как именно при использование монад данный код придётся существенно переделывать. Конечно же и при использование функции вида Apply тоже надо переделывать, т.к. это тоже в общем то функциональный подход (хотя и без монад). Но кроме этого в языке есть и другие способы (см. ниже). Но если уж ты спросил именно про Apply, то всё же отвечу для порядка, хотя естественно я бы не стал подобную фигню использовать:
for(int i=0; i<array.length(); i++) Apply(array[i], sum, [&](big_integer array_i, big_integer& sum_)
{
if (array_i*array_i > limit))
sum_+=array_i*array_i;
});
Apply со многими аргументами естественно без проблем выражается через через Apply для одного. Кстати, в C++ это ещё и можно записать сразу для всех видов монад в принципе, ну а в C# придётся записывать для каждого. Но это так, просто для общей картины.
А вот если воспользоваться "тупым императивным способом" и просто переопределить все нужные операторы для optional, то можно вообще не менять ни одну букву. Причём это естественно будет подходить сразу для всех типов. Что-то вроде:
template<typename T> auto operator+(const optional<T>& t1, const optional<T>& t2){return t1&&t2?*t1+*t2:optional<T>();}
Кстати, а в языке D все эти операторы можно реализовать сразу одной функций, т.к. там вид оператора передаётся просто как параметр (времени компиляции естественно) в функцию.