Re[33]: Кстати
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.11.09 18:13
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Это ничего не меняет. Это демонстрирует, что слова Гапертона поддерживаемые тобой заблуждение. И косвенно указывает на бессмысленность и демогогичность обсуждения устроенного вами.


Нами??? По-моему, ты первый взвился. Я ошибаюсь?

ГВ>>Да и вообще, вопрос не в том, кто что породил (прям Библия, не меньше), а зачем это было нужно.

VD>Вопрос бы один и он был очень прост. Является ли ЛИНК средством рассчитанным исключительно (или в основном) на работу с РСУБД или нет. Ответ на этот вопрос лично для меня очевиден — нет.

А нафиг всё же впёрся LINQ, если функциональный стиль и так поддерживается C# 3.0? Неужели бродилку по IEnumerable<> (к которой ты хочешь свести назначение LINQ) так сложно написать, что из-за неё стоит заморачиваться с введением аж модификаций в синтаксис C#?

ГВ>>Хм. Может, я чего-то не понимаю, но по-моему, всё, что ты тут сказал прямо доказывает, что LINQ предназначен в первую очередь для работы с SQL-серверами.

VD>Ген. Иди купи себе какой-нибудь учебник по логике. Прочти в нем раздел посвященный причино-следсвенной связи. Иначе с тобой просто невозможно говорить.

Угу-угу, кто б советовал...

VD>Подумай на досуге является ли то, что деревья качаются при ветре доказательством того, что они созданы для создания ветра?


Осталось задаться вопросом, что считать ветром, а что — деревьями. Ты, судя по всему, считаешь ветром лозунг "ФП — в массы" и ещё какую-то квази-альтруистическую риторику, я — что "надо состыковаться с SQL-сервером". Чей ветер стабильнее?

VD>Такая же фигня и с линком. Следствием его универсальности является возможность в том числе обрабатывать из хранимые в СУБД. Из факта "ЛИНК позволяет работать с данными из РСУБД" ни как не следует, что линк "предназначен в первую очередь для работы с SQL-серверами".


Вот теперь иди и покупай учебник по логике сам. Факт единственно лишь того, что LINQ работает с РСУБД не рассматривался в качестве достаточного для выводов основания ни мной, ни, полагаю, Гапертоном.

ГВ>>Зачем иначе огород городить с ExpressionTrees?


VD>Очевидно для того, чтобы можно было в рантайме проанализировать ЛИНК-запрос и что-то сделать на его основе. Частным случаем этого "что-то" является переписывание запроса в SQL и выполнение его некоторым сервером. Опять же ничто не говорит в пользу гипотезы "LINQ предназначен в первую очередь для работы с SQL-серверами".


А вот теперь подумай — на кой шут городить огород с генерацией/анализом AST, если у нас единая среда исполнения? Чтобы дать юзерам "визуальные языки"? Ещё какая-нибудь абстрактная идея света в массы?

VD>Если придерживаться твоей извращенной "логики" (в кавычках так как этот по сути алогизм), то можно заключить что ЛИНК, в первую очередь, предназначен для распределения вычислений по разным серверам, так как он позволяет это делать и есть люди которые этим пользуются.


С LINQ-ом вообще всё не слишком понятно обстоит — его, похоже, будут набивать фичами, которые больше некуда воткнуть.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[33]: Кстати
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.11.09 18:20
Оценка: :)
Здравствуйте, yuriylsh, Вы писали:

Y>А что дальше делать с полученным AST — это уже дело провайдера. Напрмер, реализовать LINQ to LLBLGen, LINQ to Twitter, LINQ to Google,...


Правильно. Это есть вполне нормальное следствие обобщения изначально узконаправленного средства.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[34]: Кстати
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.11.09 18:26
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, yuriylsh, Вы писали:


Y>>А что дальше делать с полученным AST — это уже дело провайдера. Напрмер, реализовать LINQ to LLBLGen, LINQ to Twitter, LINQ to Google,...


ГВ>Правильно. Это есть вполне нормальное следствие обобщения изначально узконаправленного средства.


Это тоже?
Re[16]: LINQ только для РСУБД!
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 18:45
Оценка: 20 (1)
Здравствуйте, Dale_ee, Вы писали:


D_>Для сохранения состояния в линке есть Aggregate. Хотя, бесспорно, с помощью цикла было бы удобнее.

D_>
D_>            var array = new[] {1, 2, 3, 7, 8, 9, 10};

D_>            var result = array.Aggregate(new 
D_>                                         {
D_>                                                PreviouslyTaken = array.FirstOrDefault() - 2,
D_>                                                PreviousElement = array.FirstOrDefault() - 2,
D_>                                                Result = (IEnumerable<int>)new int[0]
D_>                                         },
D_>                                         (ag, i) => new
D_>                                                    {
D_>                                                           PreviouslyTaken = (i - 1 == ag.PreviousElement) && ag.PreviousElement != ag.PreviouslyTaken 
D_>                                                                             ? i : ag.PreviouslyTaken,
D_>                                                           PreviousElement = i,
D_>                                                           Result = (i - 1 == ag.PreviousElement && ag.PreviousElement != ag.PreviouslyTaken)
D_>                                                                    ? ag.Result.Concat(new [] {i}) : ag.Result
D_>                                                    },
D_>                                         ag => ag.Result);
D_>


Ну, если написать код несколько ближе к описанию задачи и не увлекаться погоней за очень понятными именами переменных, то вряд ли решение основанное на цикле будет проще:

var ary = new[] { 1, 2, 3, 7, 8, 9, 10 };

var result = ary.Aggregate(new { Prev = 0,   Skip = true,  Res = new List<int>() }, (acc, cur) => 
     acc.Skip            ? new { Prev = cur, Skip = false, acc.Res }
   : acc.Prev + 1 == cur ? new { Prev = cur, Skip = true,  Res = acc.Res.AddElem(cur) }
   :                       new { Prev = cur, Skip = false, acc.Res },
  ag => ag.Res);

foreach (var item in result)
  Console.WriteLine(item);

Правда тут потребуется метод расширения позволяющий добавлять элемент в List<T> и возвращающий экземпляр этого же списка.
Тоже самое на Nemerle не требует даже наличия метода расширения:
def lst = [1, 2, 3, 7, 8, 9, 10];

def (_, _, res) = lst.Aggregate((0, true, List()), ((prev, skip, res), cur) =>
  if      (skip)            (cur, false, res)
  else if (prev + 1 == cur) (cur,  true, { res.Add(cur); res })
  else                      (cur, false, res));

WriteLine($"..$res");


ЗЫ

Определенно более продвинутый вывод типов, использование блоков кода как выражений и наличие кортежей шарпу не помешали бы. Жаль, что его авторы так близоруки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: LINQ только для РСУБД!
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 19:21
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

VD>>1. Можно ли с помощью линк обрабатывать коллекции в памяти.


ГВ>Да.


VD>>2. Можно ли с помощью линка обрабатывать ХМЛ.


ГВ>Да.


VD>>3. Есть ли в ЛИНК-е что-то что может быть применимо толко для РСУБД и не применимо для других источников данных?


ГВ>Я таких не припомню, во всяком случае.


Значит ответ тоже "да".

ГВ>Хотя LINQ и получен обобщением проблем взаимодействия с РСУБД.


Никто не спрашивал как получен линк. Так что это позволю себе проигнорировать эту фантазию. В прочем, с удовольствием послушаю логически корректное доказательство этой гипотезы.

VD>>4. Упрощает ли ЛИНК обрабтку списков объектов по сравнению с другими средствами их обработки доступными в шарпе и васике?


ГВ>По сравнению с какими?


А что в Шарпе есть какие-то средства отличные от циклов?

ГВ>Но. См. ответ на следующий вопрос.


VD>>4. Можно ли называть технологию более удобную для обработки объектов в памяти нежели для работы с СУБД "большому счету заточен под прикладную задачу, и нафиг не вперся в случае, если мы не работаем с реляционной БД"?


ГВ>Вопрос поставлен некорректно. Как понимать "более удобную для обработки объектов в памяти нежели для работы с СУБД"? Критерии сравнения "более менее" каковы?


Это вопрос к Гапертону. Это его цитата которую ты так ревностно защищаешь.

ГВ>Вот ещё пара встречных вопросов:


Я просил ответить на мои вопросы.

В прочем полученных ответов уже достаточно чтобы сделать вывод о том, что утверждения Гапертона ложны. А ЛИНК как ни странно является универсальным средством обработки данных.
Что и следовало доказать.

Так что остается последний вопрос.
Неужели тебе приятнее выглядеть человеком не владеющим азами логического мышления нежели человеком который ошибался, но понял свои ошибки?

ГВ>1) Имеем массив: {1, 2, 3, 7, 8, 9, 10}. Как из этого массива посредством LINQ извлечь элементы, на единицу большие предыдущего, при этом извлечённый элемент не должен принимать участия в последующем сравнении, т.е. результат должен быть {2, 8, 10}?


Как-то так (Nemerle, так как писать на нем приятнее):
using System.Collections.Generic;
using System.Console;
using System.Linq;

def lst = [1, 2, 3, 7, 8, 9, 10];

def (_, _, res) = lst.Aggregate((0, true, List()), ((prev, skip, res), cur) =>
  if      (skip)            (cur, false, res)
  else if (prev + 1 == cur) (cur,  true, { res.Add(cur); res })
  else                      (cur, false, res));

WriteLine($"..$res");


Объясняю преимущества перед использованием циклов.
1. Отсутствуют специальные случае вроде пустого массива которые можно забыть проверить.
2. Отсутствует работа с индексами, так что ошибка не приведет к генерации исключений в непротестированных случаях.
3. Решение задачи близко к ее постановке. Мы описывает, что хотим получить, а не то как мы это хотим получить. Нам не нужно думать о переборе значений, мы думаем только об алгоритме.

Проблема только одна. Чтобы прочесть и понят данный код нужно иметь некоторый опыт использования ФВП и абстрагирования алгоритма от его реализации.

ГВ>2) Тот же массив, но нужно извлечь элементы, отстоящие на +/-1 от выбранного. Т.е. результат — {1, 3, 7, 9}.


Не понял саму постановку задачи.

Собственно, жду твою императивную реализацию обоих задачек. Первой просто для сравнения. Второй хотя бы чтобы понять, что ты имел в виду.

ГВ>Как ты понимаешь, традиционным for обе задачи решаются тривиально.


Не не понимаю. Я понимаю, что ты постарался подобрать задачку которая по твоим соображениям плохо решается с помощью линковских функций. Более правильным направлением было бы выбрать задачи обработки матриц. В прочем и там можно использовать линк, хотя не так уж и осмысленно.
Вопрос не в том удалось тебе или не удалось придумать такие задачки.
Вопрос в том зачем ты это пытался сделать?
Ведь очевидно, что есть масса задач которые решаются с помощью линка в десятки раз удобнее. Будешь спорить?
И эти задачи никак не связаны с СУБД тем более с реляционными.
А раз так, то говорить о какой-то привязанности линка к РСУБД — это просто идти против базовых концепций логики. Говоря простыми словами — это полный идиотизм.

Так что ты еще не понял, и что ты пыташся доказать?
Или ты все же давно все понял и просто троллишь специально не желая мыслить логически?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: Кстати
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 25.11.09 19:36
Оценка:
Здравствуйте, VladD2, Вы писали:

L>>Скажем, есть некая иерархия, начальник-подчинённые. Я хочу получить точно такое же дерево, как и исходное, но не с самими персонами, а с их именами. Так не работает текущая реализация, верно?

VD>Не верно. И я уже сказал почему.

Я уже запутался Не верно — т.е. текущая реализация так работает что ли? Ты же сам пишешь, что функция нерекурсивная. Или "не верно" относится к чему-то другому?

VD>Встречный вопрос. В Хаскеле ты бы справился с обработкой дерева?


Конечно! Это же обычный map. Только для деревьев. Вот код:

query = fmap name


В общем я почитал (спасибо за ссылки). LINQ ограничивает результат конкретным типом (IEnumerable/IQueryable). В этом смысле Select ни разу ни функтор. Вернее, зависит от реализации.

В Haskell Select — это fmap (эндофунктор, отображение), поэтому его тип

public static F<B> Select<F,A,B>(Function<A,B> f, F<A> struc)


Для дерева результат — это дерево, для функции — функция, для любого другого типа данных, являющегося функтором — соответствующее отображение.
Re[34]: Кстати
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 20:03
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Нами??? По-моему, ты первый взвился. Я ошибаюсь?


Что значит "взвился". Если ты не заметил. Я вообще отвалил от этого глупого спора.

ГВ>А нафиг всё же впёрся LINQ, если функциональный стиль и так поддерживается C# 3.0?


Ты кажется любишь пообсуждать что от чего было пораждено. Так вот C# 3.0 такой какой он есть в основном благодаря LINQ.
Возможности для программирования в функциональном стиле были и в 2.0. Но удобным это стало только в 3.0, так как:
А. Язык расширели выводом типов, локаничными лямбдами и деревьями выражений.
Б. Появилась библиотека ФВП входящая в LINQ. Без нее программировать в функциональном стиле невозможно. Конечно можно было бы написать свою, но рядовой программист это не понятнул бы. Появилось бы море разных реализацию не совместимых между собой (смотрим на С++). LINQ же предоставляет отлично реализованную библиотеку максимально полно покрывающую обще потребности. И получилось все так неплохо потому что делали LINQ под контролем очень хороших функциональщиков которые в отличие от многих крикунов с нашего сайта понимают не букву ФП, а его суть.

ГВ>Неужели бродилку по IEnumerable<> (к которой ты хочешь свести назначение LINQ) так сложно написать, что из-за неё стоит заморачиваться с введением аж модификаций в синтаксис C#?


Представь себе не просто. Как и написание любой библиотеки данная задача требует системного подхода, анализа, немалых знаний и опыта. У автора LINQ-а все это было, так как он чуть ли не является соавтором хаскеля.

ГВ>Угу-угу, кто б советовал...


Я тебе советую. Ты уж извини, что это звучит резко и даже оскорбительно. Но твои суждения не выдерживаю ни какой критики. Если это не намеренный троллинг, то это это огромные проблемы.

VD>>Подумай на досуге является ли то, что деревья качаются при ветре доказательством того, что они созданы для создания ветра?


ГВ>Осталось задаться вопросом, что считать ветром, а что — деревьями.


Ну, пошла полная софистика.

ГВ>Ты, судя по всему, считаешь ветром лозунг "ФП — в массы" и ещё какую-то квази-альтруистическую риторику, я — что "надо состыковаться с SQL-сервером". Чей ветер стабильнее?


Я не намерен отвечать на очередную попытку увести обсуждение черт знает куда.

VD>>Такая же фигня и с линком. Следствием его универсальности является возможность в том числе обрабатывать из хранимые в СУБД. Из факта "ЛИНК позволяет работать с данными из РСУБД" ни как не следует, что линк "предназначен в первую очередь для работы с SQL-серверами".


ГВ>Вот теперь иди и покупай учебник по логике сам. Факт единственно лишь того, что LINQ работает с РСУБД не рассматривался в качестве достаточного для выводов основания ни мной, ни, полагаю, Гапертоном.


Да, ну? А что же за "факты" ты использовал?
И можно поинтересоваться, ты серьезно считаешь, что если факт ничего не говорящий о проблеме соединить с другими, то он начнет хоть как-то относиться к проблеме или влиять на общий вывод?

VD>>Очевидно для того, чтобы можно было в рантайме проанализировать ЛИНК-запрос и что-то сделать на его основе. Частным случаем этого "что-то" является переписывание запроса в SQL и выполнение его некоторым сервером. Опять же ничто не говорит в пользу гипотезы "LINQ предназначен в первую очередь для работы с SQL-серверами".


ГВ>А вот теперь подумай — на кой шут городить огород с генерацией/анализом AST, если у нас единая среда исполнения? Чтобы дать юзерам "визуальные языки"? Ещё какая-нибудь абстрактная идея света в массы?


А мне не надо об этом думать. Информация о том что явилось причиной для разработки универсального механизма никак не влияет на факт его использования.

Использовать деревья выражений можно как угодно. Их можно трансформировать в рантайме и скомпилировать. На этом принципе, в не малой степени реализован тип dinamic в C# 4.0. Их можно использовать для генерации запросов к ООБД которая никогда не пользовалась реляционными принципами. Их можно вообще не использовать. Например, LINQ to Objects и LINQ to XML вообще их не использут, но при этом позволяют как использовать ФВП входящие в состав LINQ-а, так и синтаксические расширения языков.

VD>>Если придерживаться твоей извращенной "логики" (в кавычках так как этот по сути алогизм), то можно заключить что ЛИНК, в первую очередь, предназначен для распределения вычислений по разным серверам, так как он позволяет это делать и есть люди которые этим пользуются.


ГВ>С LINQ-ом вообще всё не слишком понятно обстоит — его, похоже, будут набивать фичами, которые больше некуда воткнуть.


Это не понятно только с твоей колокольни. Если перестать думать о LINQ-е как о каком-то ESQL-е переростке, то все станет сразу очевидным. LINQ не набивают фичами. Наоборот на его основе делают необходимые в конкретных предметных областых расширения.

Пойми. Все очень просто. Линк — это абстрагирование от паттернов кодирования. Абстрагирование от них делает код более декларативным. А декларативный код можно интерпретировать по разному. Его вычисление можно организовать по разному. Можно распараллеливание (как в PLINQ), можно превратить код в дерево выражений в рантайме передать некоему провайдеру который сделает с ним то что нужно провайдеру (передаст на выполнение на другую машину или сформирует SQL и выполнит его в СУБД).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[34]: Кстати
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.09 20:06
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Конечно! Это же обычный map. Только для деревьев. Вот код:


L>
L>query = fmap name
L>


L>В общем я почитал (спасибо за ссылки). LINQ ограничивает результат конкретным типом (IEnumerable/IQueryable). В этом смысле Select ни разу ни функтор. Вернее, зависит от реализации.


Разве fmap не зависит от реализации?


L>В Haskell Select — это fmap (эндофунктор, отображение), поэтому его тип


L>
L>public static F<B> Select<F,A,B>(Function<A,B> f, F<A> struc)
L>


L>Для дерева результат — это дерево, для функции — функция, для любого другого типа данных, являющегося функтором — соответствующее отображение.


С Select-ом все точно так же. Просто штатных реализаций всего 2 — IEnumerable/IQueryable.
Re[34]: Кстати
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 20:13
Оценка:
Здравствуйте, lomeo, Вы писали:


L>Конечно! Это же обычный map. Только для деревьев. Вот код:


L>
L>query = fmap name
L>


А без fmap не справился бы?

L>В общем я почитал (спасибо за ссылки). LINQ ограничивает результат конкретным типом (IEnumerable/IQueryable). В этом смысле Select ни разу ни функтор. Вернее, зависит от реализации.


Там все несколько сложнее. Есть конкретные реализации завязанные на IEnumerable/IQueryable, а есть "query expression pattern" который абстрагирован от конкретики:
delegate R Func<T1,R>(T1 arg1);
delegate R Func<T1,T2,R>(T1 arg1, T2 arg2);
class C
{
  public C<T> Cast<T>();
}
class C<T> : C
{
  public C<T> Where(Func<T,bool> predicate);
  public C<U> Select<U>(Func<T,U> selector);
  public C<V> SelectMany<U,V>(Func<T,C<U>> selector, Func<T,U,V> resultSelector);
  public C<V> Join<U,K,V>(C<U> inner, Func<T,K> outerKeySelector, Func<U,K> innerKeySelector, Func<T,U,V> resultSelector);
  public C<V> GroupJoin<U,K,V>(C<U> inner, Func<T,K> outerKeySelector, Func<U,K> innerKeySelector, Func<T,C<U>,V> resultSelector);
  public O<T> OrderBy<K>(Func<T,K> keySelector);
  public O<T> OrderByDescending<K>(Func<T,K> keySelector);
  public C<G<K,T>> GroupBy<K>(Func<T,K> keySelector);
  public C<G<K,E>> GroupBy<K,E>(Func<T,K> keySelector, Func<T,E> elementSelector);
}
class O<T> : C<T>
{
  public O<T> ThenBy<K>(Func<T,K> keySelector);
  public O<T> ThenByDescending<K>(Func<T,K> keySelector);
}
class G<K,T> : C<T>
{
  public K Key { get; }
}


Ты где-то видишь здесь IEnumerable/IQueryable?

L>В Haskell Select — это fmap (эндофунктор, отображение), поэтому его тип


L>
L>public static F<B> Select<F,A,B>(Function<A,B> f, F<A> struc)
L>


fmap написан на хаскеле или это какая-то "магическая" функция предоставляемая системой?
Думаю, второе.

Потенциально конечно можно реализовать query expression pattern через рефлексию и ты получишь полный аналог fmap за исключением ограничений безопасности. Но оно надо, такое решение?

L>Для дерева результат — это дерево, для функции — функция, для любого другого типа данных, являющегося функтором — соответствующее отображение.


В хаскеле много чего нет. Например, нет инкапсуляции и безопасности на ее основе. В общем, язык другой.
Я же тебе хотел сказать о другом. В хаскеле вполне можно работат с деревьями без fmap. Более того скорее всего для реальной прикладной задачи ты как раз не будешь использовать fmap. Ты или напишешь рекурсивную функцию, или будешь работать с деревом используя знания о его структуре. Вот та же фигня и в линке.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: LINQ только для РСУБД!
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.11.09 20:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Собственно, жду твою императивную реализацию обоих задачек. Первой просто для сравнения. Второй хотя бы чтобы понять, что ты имел в виду.


Смотри сюда
Автор: Геннадий Васильев
Дата: 21.11.09
и дальше по ветке. Вторую задачу я "снял с соревнований" — слишком неясная формулировка оказалась.

По остальным пунктам позже отвечу.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[35]: Кстати
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.09 20:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В хаскеле много чего нет. Например, нет инкапсуляции и безопасности на ее основе. В общем, язык другой.

Другой, но инкапсуляция все же есть. Это как если бы в C# все поля были открыты, но инкапсуляция бы обеспечивалась только тем, что у клиентского кода есть только интерфейс сущности и нет знаний о типе, его реализующем. У хаскеля роль интерфейсов играют классы типов. Чем не инкапсуляция?
Re[35]: Кстати
От: Курилка Россия http://kirya.narod.ru/
Дата: 25.11.09 20:20
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, lomeo, Вы писали:


L>>В Haskell Select — это fmap (эндофунктор, отображение), поэтому его тип


L>>
L>>public static F<B> Select<F,A,B>(Function<A,B> f, F<A> struc)
L>>


VD>fmap написан на хаскеле или это какая-то "магическая" функция предоставляемая системой?

VD>Думаю, второе.

См. Functor, ничего магического
Re[39]: LINQ только для РСУБД!
От: Lloyd Россия  
Дата: 25.11.09 20:55
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Насчёт состояние == мутабельность, это, конечно, не совсем так, но обычно, когда говорят "состояние" подразумевают именно изменяемое состояние.


Gaperton, куда ж ты слился-то. Ты же так активно отстаивал, что состояние == мутабльность. А теперь так резко замолчал.
Re[43]: LINQ только для РСУБД!
От: Lloyd Россия  
Дата: 25.11.09 21:00
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Поэтому давай не будем лить воду из пустого в порожнее.


Да я не против.
Просто ваш коллега настолько рьяно настаивал, что состояние — это неизменно мутабельность, что я начал сомневаться в здравом смысле. Но, судя по тому, что он не только не стал вам возражать, но и плюсует ваши посты, можно сделать вывод, что мы просто друг друга не до конца поняли.
Re[17]: LINQ только для РСУБД!
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 21:16
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Смотри сюда
Автор: Геннадий Васильев
Дата: 21.11.09
и дальше по ветке. Вторую задачу я "снял с соревнований" — слишком неясная формулировка оказалась.


В приведенном сообщении полной реализации нет. Смотреть тонных вложенных сообщений нет никакого желания. Так что жду полного примера здесь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: Кстати
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.11.09 21:16
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>Нами??? По-моему, ты первый взвился. Я ошибаюсь?


VD>Что значит "взвился". Если ты не заметил. Я вообще отвалил от этого глупого спора.


ГВ>>А нафиг всё же впёрся LINQ, если функциональный стиль и так поддерживается C# 3.0?

VD>Ты кажется любишь пообсуждать что от чего было пораждено. Так вот C# 3.0 такой какой он есть в основном благодаря LINQ.

Угу. Вполне это допускаю, что ради интеграции LINQ пришлось доработать C#. Значит, -1 аргумент в пользу "благих намерений" MS.

VD>Возможности для программирования в функциональном стиле были и в 2.0. Но удобным это стало только в 3.0, так как:

VD>А. Язык расширели выводом типов, локаничными лямбдами и деревьями выражений.

Угу-угу. Отображать структуру IL-кода прайвеси не позволяет, могут не понять. Потому пришлось городить дополнительный огород с отображаемыми выражениями. Между прочим, это самый простой и естественный способ построения развитого ORM даже средствами C++. Уж поверь мне на слово.

VD>Б. Появилась библиотека ФВП входящая в LINQ. Без нее программировать в функциональном стиле невозможно. Конечно можно было бы написать свою, но рядовой программист это не понятнул бы. Появилось бы море разных реализацию не совместимых между собой (смотрим на С++). LINQ же предоставляет отлично реализованную библиотеку максимально полно покрывающую обще потребности. И получилось все так неплохо потому что делали LINQ под контролем очень хороших функциональщиков которые в отличие от многих крикунов с нашего сайта понимают не букву ФП, а его суть.


Ёлки зелёные. Это никак не отражается на том назначении LINQ, которое (на мой взгляд) просвечивает у него через все дырки.

ГВ>>Неужели бродилку по IEnumerable<> (к которой ты хочешь свести назначение LINQ) так сложно написать, что из-за неё стоит заморачиваться с введением аж модификаций в синтаксис C#?

VD>Представь себе не просто. Как и написание любой библиотеки данная задача требует системного подхода, анализа, немалых знаний и опыта. У автора LINQ-а все это было, так как он чуть ли не является соавтором хаскеля.

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

ГВ>>Угу-угу, кто б советовал...

VD>Я тебе советую. Ты уж извини, что это звучит резко и даже оскорбительно. Но твои суждения не выдерживаю ни какой критики. Если это не намеренный троллинг, то это это огромные проблемы.

Давай замнём этот вопрос для ясности. Так оно спокойней.

VD>>>Подумай на досуге является ли то, что деревья качаются при ветре доказательством того, что они созданы для создания ветра?

ГВ>>Осталось задаться вопросом, что считать ветром, а что — деревьями.
VD>Ну, пошла полная софистика.

Какая ж это софистика? Это сотая попытка прояснить действительные причины супротив вымышленных.

ГВ>>Ты, судя по всему, считаешь ветром лозунг "ФП — в массы" и ещё какую-то квази-альтруистическую риторику, я — что "надо состыковаться с SQL-сервером". Чей ветер стабильнее?

VD>Я не намерен отвечать на очередную попытку увести обсуждение черт знает куда.

Иными словами, тебе плевать на установление действительных причин. Согласен, гораздо проще руководствоваться иллюзиями альтруизма MS.

ГВ>>Вот теперь иди и покупай учебник по логике сам. Факт единственно лишь того, что LINQ работает с РСУБД не рассматривался в качестве достаточного для выводов основания ни мной, ни, полагаю, Гапертоном.

VD>Да, ну? А что же за "факты" ты использовал?
VD>И можно поинтересоваться, ты серьезно считаешь, что если факт ничего не говорящий о проблеме соединить с другими, то он начнет хоть как-то относиться к проблеме или влиять на общий вывод?

Я очень хорошо знаю о проблеме ORM и соответствующих фактах наличия сторонних средств. И очень хорошо знаю, что до LINQ собственных более или менее адекватных средств разрешения этой проблемы у MS не было. Почему я должен скидывать эти два соображения со счетов — сие мне неведомо. Ещё я очень хорошо знаю, что под "источником данных" чаще всего подразумевается РСУБД, такова общая практика. Ещё я могу припомнить кое-что из своей практики, после всего этого, поверь, можно сделать очень много выводов.

ГВ>>А вот теперь подумай — на кой шут городить огород с генерацией/анализом AST, если у нас единая среда исполнения? Чтобы дать юзерам "визуальные языки"? Ещё какая-нибудь абстрактная идея света в массы?

VD>А мне не надо об этом думать. Информация о том что явилось причиной для разработки универсального механизма никак не влияет на факт его использования.

Если тебе не надо об этом думать — никто тебя не заставляет. Просто скажи, что тебе не интересно это обсуждать и выйди из обсуждения. Только какой смысл при этом встревать с опровержениями высказываний других? Ты считаешь LINQ универсальным средством, введённым MS ради заботы о малых сих — нет проблем. А я этого не считаю и поддерживаю разными +-*/ тех, кто высказывается в таком ключе, вот и весь спор. Переубедить меня сможет, вполне вероятно, письмо Билла Гейтса, датированное 2001-м годом, где будет написано: "...we need to implement functional programming for our customers, are you know somebody good in functional languages development?" Если у тебя завалялось такое, то я с удовольствием соглашусь с твоими доводами. Если нет или потёр случайно — ну извини, я продолжаю считать, что первопричиной разработки LINQ явился OR-импеданс. Это просто, понятно и лишено обоснований с привлечением иррациональных соображений.

VD>Использовать деревья выражений можно как угодно. Их можно трансформировать в рантайме и скомпилировать. На этом принципе, в не малой степени реализован тип dinamic в C# 4.0. Их можно использовать для генерации запросов к ООБД которая никогда не пользовалась реляционными принципами. Их можно вообще не использовать. Например, LINQ to Objects и LINQ to XML вообще их не использут, но при этом позволяют как использовать ФВП входящие в состав LINQ-а, так и синтаксические расширения языков.


Для "как угодно" у них довольно узкий набор, хотя вполне достаточный для построения сложных выражений, не буду спорить. Но вот кое-чего в Linq.Expressions нет. Например, нет меток/goto. По странному стечению обстоятельств goto отсутствует и в выражениях SQL-запросов. Кстати, этот факт служит дополнительным аргументом (помимо других) для введения ФП-свойств в любой язык программирования, который предполагается использовать в тесной связи с SQL-серверами.

ГВ>>С LINQ-ом вообще всё не слишком понятно обстоит — его, похоже, будут набивать фичами, которые больше некуда воткнуть.

VD>Это не понятно только с твоей колокольни. Если перестать думать о LINQ-е как о каком-то ESQL-е переростке, то все станет сразу очевидным. LINQ не набивают фичами. Наоборот на его основе делают необходимые в конкретных предметных областых расширения.

Ладно, согласен. Не набивают, а пришивают куда угодно. На основное соображение, оспариваемое без малого двумя сотнями сообщений это никак не влияет.

VD>Пойми. Все очень просто. Линк — это абстрагирование от паттернов кодирования. Абстрагирование от них делает код более декларативным.


Вот за такую постановку задачи бьют канделябром. Исключение составляют совсем юные и синеглазые. Им можно изъясняться подобными оборотами.

VD>А декларативный код можно интерпретировать по разному. Его вычисление можно организовать по разному. Можно распараллеливание (как в PLINQ), можно превратить код в дерево выражений в рантайме передать некоему провайдеру который сделает с ним то что нужно провайдеру (передаст на выполнение на другую машину или сформирует SQL и выполнит его в СУБД).


Ну да-да. "Слоны всем, в ямы никого, Джунгахора!" Ладно, если не вышучивать, то всё это — вполне естественные следствия ФП. Хотя на мой взгляд, подо всё это хозяйство логичнее было бы завести подходящие атрибуты в C#.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[18]: LINQ только для РСУБД!
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.11.09 21:19
Оценка:
Здравствуйте, VladD2, Вы писали:

ГВ>>Смотри сюда
Автор: Геннадий Васильев
Дата: 21.11.09
и дальше по ветке. Вторую задачу я "снял с соревнований" — слишком неясная формулировка оказалась.

VD>В приведенном сообщении полной реализации нет. Смотреть тонных вложенных сообщений нет никакого желания. Так что жду полного примера здесь.

Их там две. Ладно, цитирую:

// раз
delegate void F<in T>(T arg);

static void sample1(int[] arr, F<int> func)
{
  for(int i = 1; i < arr.Length; ++i)
  {
    if (arr[i] - arr[i - 1] == 1)
    {
      func(arr[i]);
      ++i;
    }
  }
}

// два
static IEnumerable<int> sample1b(IEnumerable<int> arr)
{
  bool first = true;
  int prev = 0;
  foreach (int i in arr)
  {
    if (first)
    {
      first = false;
      prev = i;
    }
    else if (i - prev == 1)
    {
      yield return i;
      first = true;
    }
    else prev = i;
  }
}


Куда уж полнее-то?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[30]: Кстати
От: IT Россия linq2db.com
Дата: 25.11.09 21:21
Оценка: +1 :)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>>>Как это вяжется с тем, что Linq, мол, предназначен для любых источников данных? Получается, что только для тех, которые сводятся к РСУБД-like.

IT>>Ты можешь дать определение РСУБД-like типам данных? Гапертон не смог.

ГВ>В данном случае ключевой признак — отсутствие связей внутри отношения. Остальное — см. теорию РСУБД.


Дай ссылочку на твою теорию, я посмотрю. А то мне не понятно как внутри отношения (слова, которое означает 'связь, зависимость') могут отсутствовать связи.
Если нам не помогут, то мы тоже никого не пощадим.
Re[19]: LINQ только для РСУБД!
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 21:28
Оценка: -1 :)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Куда уж полнее-то?


А ту где будет и массив и вывод результатов. Ты же просил решить задачу. Ну, вот и покажи ее полное решение.
А то как-то неудобно полную программу сравнивать с фрагментами реализации.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: LINQ только для РСУБД!
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 21:30
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

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