Re[12]: Давайте поговорим о c# 3.0
От: Mirrorer  
Дата: 24.09.08 11:43
Оценка: 10 (3) +2
Здравствуйте, 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


И все эти функции появившиеся в третьем шарпе злостные баяны в ФП мире, которые по чуть-чуть перетягиваются в мейнстрим. И для того, чтобы понять какие возможности они открывают, надо глядеть на функциональные языки.
Такие дела.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.