Здравствуйте, MxKazan, Вы писали:
MK>Вопрос то не в этом. Пока что большинство аргументов "за" выглядят примерно так: "появилась новая фича, значит она точно необходима и ей нужно пользоваться".
MK>Не опровергая её необходимости, просто хотелось бы увидеть реальные примеры, в которых четко обозначено "было так, не нравилось потому то", "сделал по новому и это решило то-то".
Ну например. Возьмем простой пример. Просуммировать список чисел
var someList = new int {1,2,3,4,5};
var sum = 0;
foreach var x in someList
sum += x
Идея какая такой операции. Пробежать по всем элементам списка и сложить все в сумму.
То бишь аккумулировать результат.
Допустим нам понадобилось сделать умножение.
Проще простого
var sum = 1;
foreach var x in someList
sum *= x
И что видно ? Видно дублирование кода. Отличие только в начальном значении суммы и функции, которая будет применяться на каждом шаге.
Хорошо было бы иметь возможность указывать только эту информацию, без того, чтобы каждый раз писать foreach
Итак пишем функцию
public A Accumulate<A,I>(A accum, Func<A, I, A> fun, List<I> list)
{
foreach (var x in list)
{
accum = fun(x, accum);
}
return accum;
}
// а вот так используем
var sum2 = Accumulate<int, int>(0, (s, x) => s + x);
Мы теперь можно чувствовать себя крутым. Мы абсрагировали способ обхода коллекции (foreach) от операций которые будут выполняться на каждом шаге. Уберутся ненужные дублирования и т.п.
Но это ощущение быстро рассеивается поскольку в C# 3.0 наша доморощенная Accumulate уже есть
var sum = l.Aggregate(0, (s, x) => s + x);
А в f#
оно вообще будет выглядеть как
let sum = foldl (+) 0 someList
И все эти функции появившиеся в третьем шарпе злостные баяны в ФП мире, которые по чуть-чуть перетягиваются в мейнстрим. И для того, чтобы понять какие возможности они открывают, надо глядеть на функциональные языки.
Такие дела.