Аннотация:
Цель данной статьи – объяснить читателю незнакомому с ФП, что такое функциональный подход, какие он дает преимущества, и как его можно использовать с помощью LINQ и C# 3.0.
Кроме того, эта статья дает некоторое понимание того, как работает «LINQ to Object» и на каких принципах он основан.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: LINQ как шаг к функциональному программированию
Обычно, при использовании сокращений (даже общеизвестных), принято в первый раз упомянуть термин полностью, а следом указать аббревиатуру в скобках, и, далее, уже пользоваться кратким обозначением.
Это как объявление и использование переменных
Даже в узкоспециализированной литературе пренебрегать этим, ИМХО, неправильно: тяжело сразу настроить мозг на "раскрытие" сокращений и чтение уже не такое лёгкое, и удовольствия от него меньше.
Аббревиатуры "ФП" и "ИЯ" встречаются сразу без предупреждения:
Но чтобы иметь возможность читать (и писать) функциональный код надо быт знакомыми с основными приемами ФП.
Меж тем в ИЯ имеется множество конструкций создающих побочные эффекты.
Help will always be given at Hogwarts to those who ask for it.
Re: LINQ как шаг к функциональному программированию
Здравствуйте, Влад!
Статью читал в журнале. Очень понравилась. Взял на вооружение.
Но очень огорчает большое количество орфографических ошибок в тексте.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: LINQ как шаг к функциональному программированию
Здравствуйте, Cyberax, Вы писали:
MS>>Но очень огорчает большое количество орфографических ошибок в тексте. C>Это чтоб сразу было видно, что Влад пишет
Вместо того, чтобы писать вот такие комментарии про людей, которые для тебя статьи пишут, лучше бы предложил свои услуги по вычитке и коррекции текста.
Re[4]: LINQ как шаг к функциональному программированию
Здравствуйте, AngeL B., Вы писали:
AB>Здравствуйте, Cyberax, Вы писали:
AB>Вместо того, чтобы писать вот такие комментарии про людей, которые для тебя статьи пишут, лучше бы предложил свои услуги по вычитке и коррекции текста.
Да разве же я с претензией написал это? Скорее просто пожелание на будущее. И если что, то мог бы принять участие в корректировке тексте перед публикацией.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: LINQ как шаг к функциональному программированию
Здравствуйте, McSim, Вы писали:
MS>Да разве же я с претензией написал это? Скорее просто пожелание на будущее. И если что, то мог бы принять участие в корректировке тексте перед публикацией.
To McSim: Я не про твою фразу написал, а про Cyberax-овскую
Re[2]: LINQ как шаг к функциональному программированию
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, McSim, Вы писали:
VD>Это довольно странно, так как статьи проходит корректуру в редакции. VD>Огромная просьба выслать примеры ошибок на адрес mag@rsdn.ru или submit@rsdn.ru.
К сожалению с собой только диск от журнала. Мне надо посмотреть на сами страницы журнала.
Сейчас же из статьи с диска несколько цитат:
1.
Далее в запросе просто используются выражения:
where УСЛОВИЕ_ФИЛЬРАЦИИ
select ОПИСАНИЕ_ВОЗВРАЩЯЕМОГО_ЗНАЧЕНИЯ
2. Такая проблема может возникнуть, например, если вам потребуется создать собственную реализацию EqualityComparer основанную на лябде:
и т.д.
Т.е., то буква пропущена, то местами поменяны, то запятой нету.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: LINQ как шаг к функциональному программированию
Здравствуйте, McSim, Вы писали:
MS>Здравствуйте, VladD2, Вы писали:
VD>>Здравствуйте, McSim, Вы писали:
VD>>Это довольно странно, так как статьи проходит корректуру в редакции. VD>>Огромная просьба выслать примеры ошибок на адрес mag@rsdn.ru или submit@rsdn.ru.
MS>К сожалению с собой только диск от журнала. Мне надо посмотреть на сами страницы журнала.
Спешка, увы, дает о себе знать.
Re[4]: LINQ как шаг к функциональному программированию
Здравствуйте, AngeL B., Вы писали:
C>>Это чтоб сразу было видно, что Влад пишет AB>Вместо того, чтобы писать вот такие комментарии про людей, которые для тебя статьи пишут, лучше бы предложил свои услуги по вычитке и коррекции текста.
Я это не в упрёк Владу, его орфографические ашыпки и очепятки — уже давно неотъемлимая часть РСДН.
Sapienti sat!
Re: LINQ как шаг к функциональному программированию
Похоже китайская техника копипейста добралась и до статей =)
Особенность 1: В ФЯ иногда можно встретить два варианта этой функции FoldLeft, FoldRight. Первая производит свертку от начала списка к концу, вторая, соответственно, наоборот, от начала к концу.
Re: LINQ как шаг к функциональному программированию
Здравствуйте, Чистяков Влад (VladD2), Вы писали:
ЧВV>Аннотация: ЧВV>Цель данной статьи – объяснить читателю незнакомому с ФП, что такое функциональный подход, какие он дает преимущества, и как его можно использовать с помощью LINQ и C# 3.0. ЧВV>Кроме того, эта статья дает некоторое понимание того, как работает «LINQ to Object» и на каких принципах он основан.
Здравствуйте, Влад!
Статья очень понравилась. С нетерпением жду продолжения.
Здравствуйте, Alf, Вы писали:
Alf>Похоже китайская техника копипейста добралась и до статей =)
Ну, обладая некоторым талантом можно и без копипаста накосячить
Alf>Особенность 1: В ФЯ иногда можно встретить два варианта этой функции FoldLeft, FoldRight. Первая производит свертку от начала списка к концу, вторая, соответственно, наоборот, от начала к концу.
Да, есть такая ошибка. Сам заметил, но уже поздно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: LINQ как шаг к функциональному программированию
Идентификатор seed при вызове func -- это ошибка или что-то другое?
public static TAccumulate AggregateRight<TSource, TAccumulate>(
this IEnumerable<TSource> source,
TAccumulate acc,
Func<TAccumulate, TSource, TAccumulate> func)
{
if (source == null)
throw New ArgumentNullException("source");
if (func == null)
throw New ArgumentNullException("func");
foreach (TSource item in source.Reverse())
acc = func(seed, item);
return acc;
}
PS. Из статьи можно было бы смело выкинуть, как минимум, 1/3 текста при сохранении той же информативности.
PPS. По ходу чтения сильно напрягает стиль изложения "от первого лица" с наездами на "императивных программистов".
PPPS. Надеюсь, что 90% императивных программистов все-таки пишут так:
for (int i = 0; i < array1.Length; i++)
{
if (i != 0)
result += ", ";
result += array1[i];
}
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: LINQ как шаг к функциональному программированию
ЧВV>Авторы: ЧВV> Чистяков Влад (VladD2)
ЧВV>Аннотация: ЧВV>Цель данной статьи – объяснить читателю незнакомому с ФП, что такое функциональный подход, какие он дает преимущества, и как его можно использовать с помощью LINQ и C# 3.0. ЧВV>Кроме того, эта статья дает некоторое понимание того, как работает «LINQ to Object» и на каких принципах он основан.
Жаль про join не рассказали ничего.
Повреждение мозга после ректальной биопсии — редкая штука (с) Хаус
Re[2]: LINQ как шаг к функциональному программированию
Здравствуйте, eao197, Вы писали:
E>PPPS. Надеюсь, что 90% императивных программистов все-таки пишут так: E>
E>for (int i = 0; i < array1.Length; i++)
E>{
E> if (i != 0)
E> result += ", ";
E> result += array1[i];
E>}
E>
Надеюсь что любой грамотный программист напишет вот так:
var sb = new StringBuilder();
for (int i = 0; i < array1.Length; i++)
{
if (i != 0)
sb.Append(", ");
sb.Append(array1[i]);
}
result = sb.ToString();
Кроме того за все в этой жизни надо платить, в том числе и за лаконичность LINQ, вот результаты конкатенации массива чисел из 10000 элементов:
Способ: императивный
Расход памяти: 1200 kb
Время: 1600 ms
Способ: LINQ
Расход памяти: 2400 kb
Время: 860 ms
Способ: StringBuilder
Расход памяти: 580 kb
Время: 4 ms
Интересно что Linq отаработал в два раза быстрее и сожрал в два раза больше памяти, чем простой цикл. Ну а последний результат, как говорится без коментариев