Re[15]: LINQ только для РСУБД!
От: Dale_ee Эстония www.ammyui.com
Дата: 25.11.09 09:58
Оценка: 20 (1)
ГВ>Вот ещё пара встречных вопросов:

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


Для сохранения состояния в линке есть Aggregate. Хотя, бесспорно, с помощью цикла было бы удобнее.
            var array = new[] {1, 2, 3, 7, 8, 9, 10};

            var result = array.Aggregate(new 
                                         {
                                                PreviouslyTaken = array.FirstOrDefault() - 2,
                                                PreviousElement = array.FirstOrDefault() - 2,
                                                Result = (IEnumerable<int>)new int[0]
                                         },
                                         (ag, i) => new
                                                    {
                                                           PreviouslyTaken = (i - 1 == ag.PreviousElement) && ag.PreviousElement != ag.PreviouslyTaken 
                                                                             ? i : ag.PreviouslyTaken,
                                                           PreviousElement = i,
                                                           Result = (i - 1 == ag.PreviousElement && ag.PreviousElement != ag.PreviouslyTaken)
                                                                    ? ag.Result.Concat(new [] {i}) : ag.Result
                                                    },
                                         ag => ag.Result);
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[40]: LINQ только для РСУБД!
От: Gaperton http://gaperton.livejournal.com
Дата: 25.11.09 10:11
Оценка:
Здравствуйте, Lloyd, Вы писали:

G>>Функцией-генератором я в данном случае назвал seq( startIdx, endIdx, step ), которая генерирует последовательность индексов начиная со startIdx, не более чем endIdx, с шагом step. В Эрланге этому соответствует именно вызов функции. В Хаскеле/Clean может быть записан как список, что-то вроде [1..n], а при преобразовании comprehensions в циклы — эта штука преобразуется тупо в заголовок цикла for.


L>Тогда непонятно как ты будешь "транформировать массив", если ни одна из перечиленных функций не меняет состояния. Как в итоге массив окажется странсформированным?


Элементарно. Новый массив создается. Старый — не изменяется. Если написать программу на Хаскеле, которая реализует мой алгоритм с компрехеншнсами, то все именно так и будет.

А состояние всей системы для внешнего наблюдателя в чистом языке при этом конечно изменится — но это уже совсем другое "состояние". Это состояние — World, и рассуждения о его изменении лишено практической пользы и смысла. Так как в силу отсутствия мутабельных операций, для внутренних "наблюдателей" состояние меняться не будет. Релятивистские эффекты, пнимаешь. Все относительно.

На философские вопросы о состоянии и прочей терминологии очень хорошо получается отвечать у lomeo здесь рядом. Он — умница, поговори с ним. Все правильно пишет.

Кстати, смысл так понравившейся тебе фразы "человек либо понимает, либо нет", состоит в том, что первично на самом деле желание понять. Если этого желания нет, то объяснять что-либо бесполезно. Человек будет спорить, спорить, спорить... У меня складывается ощущение, что у тебя первичным было желание "объяснить мне, что я неправ". Плохое желание. С таким желанием легко попасть в глупое положение.
Re[40]: LINQ только для РСУБД!
От: Gaperton http://gaperton.livejournal.com
Дата: 25.11.09 10:23
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Нет, для внешнего наблюдателя каждый раз порождается новое состояние на основе старого. Изменения переменных нет.


1)
x.DoSomething()

x — объект, он имеет состояние. Оно изменилось.

2)
x_1 = DoSomething( x )

x — не изменился. x_1 — новое значение.

Наличие мутабельных операций и операции присваивания связывают не только с "прозрачностью по ссылкам", но оно так же тесно связано с наличием у объектов identity.

В случае (1) у тебя есть "идентити" у объекта х — например, ссылка или указатель. И именно потому, что у объекта есть состояние. Ты вызвал DoSomething. Состояние этого объекта, с идентити &x, изменилось. Но это тот же самый объект.

То есть, у тебя в данном случае в системе могут быть разные объекты, но с одинаковым состоянием.

Теперь рассмотрим (2). Объекты в такой системе не имеют "идентити", оно им просто не нужно. Они имеют только значения, которые могут меняться. Значения могут быть равны, или не равны. Никаких "объектов", имеющих идентити и состояние, при отсутствии мутабельного состояния и присваивания нет. Как в математике — нет там ни присваивания, ни состояний.

Единственно, о чем ты можешь говорить в данном случае — это о моделировании состояния. "Протянутое состояние" — это один из способов его смоделировать, когда его нет.

Это фундаментальный принцип, который иллюстрирует саму суть "чистоты".
Re[41]: LINQ только для РСУБД!
От: Lloyd Россия  
Дата: 25.11.09 10:26
Оценка:
Здравствуйте, Gaperton, Вы писали:

L>>Тогда непонятно как ты будешь "транформировать массив", если ни одна из перечиленных функций не меняет состояния. Как в итоге массив окажется странсформированным?


G>Элементарно. Новый массив создается. Старый — не изменяется. Если написать программу на Хаскеле, которая реализует мой алгоритм с компрехеншнсами, то все именно так и будет.


Теперь понятно. Но согласись, несколько странно говорить, что состояние — мутабельное, когда оно на самом деле не меняется.

G>Кстати, смысл так понравившейся тебе фразы "человек либо понимает, либо нет", состоит в том, что первично на самом деле желание понять. Если этого желания нет, то объяснять что-либо бесполезно. Человек будет спорить, спорить, спорить... У меня складывается ощущение, что у тебя первичным было желание "объяснить мне, что я неправ". Плохое желание. С таким желанием легко попасть в глупое положение.


Очень самокритично.
Re[41]: Правка
От: Gaperton http://gaperton.livejournal.com
Дата: 25.11.09 10:29
Оценка:
G>Теперь рассмотрим (2). Объекты в такой системе не имеют "идентити", оно им просто не нужно. Они имеют только значения, которые не могут меняться. Значения могут быть равны, или не равны. Но объекты неотличимы друг от друга. Никаких "объектов", имеющих идентити и состояние, при отсутствии мутабельного состояния и присваивания нет. Как в математике — нет там ни присваивания, ни состояний.
Re[29]: Кстати
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.11.09 10:32
Оценка:
Здравствуйте, IT, Вы писали:

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

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

В данном случае ключевой признак — отсутствие связей внутри отношения. Остальное — см. теорию РСУБД.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[42]: LINQ только для РСУБД!
От: Gaperton http://gaperton.livejournal.com
Дата: 25.11.09 10:37
Оценка:
Здравствуйте, Lloyd, Вы писали:

G>>Кстати, смысл так понравившейся тебе фразы "человек либо понимает, либо нет", состоит в том, что первично на самом деле желание понять. Если этого желания нет, то объяснять что-либо бесполезно. Человек будет спорить, спорить, спорить... У меня складывается ощущение, что у тебя первичным было желание "объяснить мне, что я неправ". Плохое желание. С таким желанием легко попасть в глупое положение.


L>Очень самокритично.


Самокритично это было бы, если бы я говорил о себе. А я просто разъясняю тебе смысл фразы. И кроме того, ко мне это при всем желании отнести тяжело — у меня нет навязчивого желания кому-либо доказывать, что он неправ, "истины ради". Это вы у нас пережить не можете, если чье-то мнение с вашим не совпадает.
Re[43]: LINQ только для РСУБД!
От: Lloyd Россия  
Дата: 25.11.09 10:52
Оценка:
Здравствуйте, Gaperton, Вы писали:

L>>Очень самокритично.


G>Самокритично это было бы, если бы я говорил о себе. А я просто разъясняю тебе смысл фразы. И кроме того, ко мне это при всем желании отнести тяжело — у меня нет навязчивого желания кому-либо доказывать, что он неправ, "истины ради". Это вы у нас пережить не можете, если чье-то мнение с вашим не совпадает.


Вы очень тонкий психолог. Вот так, по паре десятков постов, точно поставить диагноз, это вызывает уважение. Браво, маэстро. Снимаю шляпу.
Re[41]: LINQ только для РСУБД!
От: Lloyd Россия  
Дата: 25.11.09 11:09
Оценка:
Здравствуйте, lomeo, Вы писали:

L>>>Глобальная переменная const — неизменяемая. Состояние или нет? Если да, то состояние — это что угодно, если нет, то под глобальным состоянием следует понимать именно изменяемое состояние. Как то так.

L>>Состояние, конечно.

L>Хорошо. У нас есть состояние — все привязки в нашей программе, например, связи фунции с их именами. Какие рассуждения можно вести в терминах понятия "состояние" о программе, учитывая, что оно, а следовательно и поведение программы, неизменно? Какие рассуждения можно получить из понятия "Вселенная" в физике, а не в философии? Т.е. какие полезные рассуждения могут быть проведены?


К чему все это? Если вы согласились, что это состояние, то обсуждение закончено, т.к. тем самым опровергнуто, что из наличия состояния автоматически следует мутабельность. Это собственно и смутило меня в рассуждениях Gaperton-а.
Или я все-таки опять чего-то недопонимаю?
Re[42]: LINQ только для РСУБД!
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 25.11.09 12:15
Оценка: +1
Здравствуйте, Lloyd, Вы писали:

L>К чему все это? Если вы согласились, что это состояние, то обсуждение закончено, т.к. тем самым опровергнуто, что из наличия состояния автоматически следует мутабельность. Это собственно и смутило меня в рассуждениях Gaperton-а.

L>Или я все-таки опять чего-то недопонимаю?

Цитирую себя, любимого

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


т.е. о том, что состояние != мутабельность было сказано в первом же комменте. Что тут обсуждать? В ФП же обычно под состоянием понимается именно изменяемое состояние. Поэтому когда Gaperton говорил о состоянии, было вполне ясно из контекста, что имеется в виду.

Мои мотивы — мне показалось, что тебе это неизвестно, поэтому я попытался прояснить этот момент, чтобы устранить непонимание. В результате же непонимания стало ещё больше.

Поэтому давай не будем лить воду из пустого в порожнее.
Re[30]: Кстати
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 13:50
Оценка:
Здравствуйте, lomeo, Вы писали:

L>А LINQ работает с деревом?


Любое дерево можно представить в виде вложенных списков дочерних элементов. По этому ответ и да, и нет.
Прямых средств работы с деревьями в линке нет. Но с тем же ХМЛ-ем получается работать без пробелем, хотя он и есть чистой воды деревом.

L>Если да — from obj in tree select obj.name — вернёт дерево имён или просто список?


Вернет просто списко. Но такой код особого смысла не имеет. Скорее всего будет что-то вроде:
var nodes = from node in tree.Elements() where node.Name.StartsWith("prefix") select node;

И тогда в nodes будет часть дерева, которую можно снова обработать.
Если, скажем, поместить подобный запрос в рекурсивную функцию, то можно организовать и рекурсивную обработку дерева.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Кстати
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 14:14
Оценка: 10 (1)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Интересная мысль, но не совсем так.


Агащазблин.

ГВ>Список всё же подразумевает отношение порядка "последующий-предыдущий", или хотя бы "голова-хвост".


В информатике "Список" — это упорядоченное множество элементов в котором некоторые элементы могут встречаться ноль или несколько раз.

ГВ>В случае с LINQ ключевая концепция другая — итератор. Однонаправленный, заметь.


Итератор — это частный термин имеющий разные значения в разных контекстах. Если уж быть точным, то в донтете используется не менее частная концепция — энумератор.

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

Главное, что ваши рассуждения о релляционности линка — это полнейшее заблуждение или намеренная дезинформация.
Заявлять, что у линка релляционная природа — это все равно, что заявлять, что причина ветра заключается в качании деревьев, т.е. вы подменяете причину и следствие.

Повторяю еще раз свою мысль. Надеюсь, что последний.

В основе LINQ лежит библиотека работы со списками Haskell (Haskell prelude). Идея обобщения источников данных была предложена Меером еще в Хаскеле. Меер заметил, что все операции над БД можно выразить в терминах Haskell prelude. В результате Меер создал ДСЛ-библиотеку который в рантайме переписывал код выраженный в виде функций высшего порядка в аналогичный ему SQL. Позже он перешел на работу в Microsoft и разработал библиотеку аналогичную Haskell prelude, а так же идею Expression tree смысл которой заключается в том, чтобы заставить компилятор генерировать не исполняемый код, а AST которое можно будет анализировать в рантайме. Именно это позволило использовать линк для доступа к внешним серверам вроде SQL-серверов. Но это нисколичко не означает, что нельзя обращаться к другим серверам данные которых можно представить в виде списков.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Кстати
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 25.11.09 14:47
Оценка:
Здравствуйте, VladD2, Вы писали:

L>>Если да — from obj in tree select obj.name — вернёт дерево имён или просто список?

VD>Вернет просто списко. Но такой код особого смысла не имеет.

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

VD>Скорее всего будет что-то вроде:

VD>
VD>var nodes = from node in tree.Elements() where node.Name.StartsWith("prefix") select node;
VD>

VD>И тогда в nodes будет часть дерева, которую можно снова обработать.

Т.е. Elements возвращяет элементы верхнего уровня? И проверка работает только над ними?
Re[32]: Кстати
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 15:24
Оценка:
Здравствуйте, lomeo, Вы писали:

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


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

L>Т.е. Elements возвращяет элементы верхнего уровня? И проверка работает только над ними?


Нужны другие уровни, используй:
from node in tree.Elements()
from subnode in node.Elements()
...

Нужна рекурсия пиши рекурсивную функцию обрабатывающую один уровень.

Встречный вопрос. В Хаскеле ты бы справился с обработкой дерева?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Кстати
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.11.09 16:25
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Повторяю еще раз свою мысль. Надеюсь, что последний.


VD>В основе LINQ лежит библиотека работы со списками Haskell (Haskell prelude). Идея обобщения источников данных была предложена Меером еще в Хаскеле. Меер заметил, что все операции над БД можно выразить в терминах Haskell prelude. В результате Меер создал ДСЛ-библиотеку который в рантайме переписывал код выраженный в виде функций высшего порядка в аналогичный ему SQL.


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

VD>Позже он перешел на работу в Microsoft и разработал библиотеку аналогичную Haskell prelude, а так же идею Expression tree смысл которой заключается в том, чтобы заставить компилятор генерировать не исполняемый код, а AST которое можно будет анализировать в рантайме. Именно это позволило использовать линк для доступа к внешним серверам вроде SQL-серверов. Но это нисколичко не означает, что нельзя обращаться к другим серверам данные которых можно представить в виде списков.


Хм. Может, я чего-то не понимаю, но по-моему, всё, что ты тут сказал прямо доказывает, что LINQ предназначен в первую очередь для работы с SQL-серверами. Зачем иначе огород городить с ExpressionTrees?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[32]: Кстати
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 16:46
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

VD>>В основе LINQ лежит библиотека работы со списками Haskell (Haskell prelude). Идея обобщения источников данных была предложена Меером еще в Хаскеле. Меер заметил, что все операции над БД можно выразить в терминах Haskell prelude. В результате Меер создал ДСЛ-библиотеку который в рантайме переписывал код выраженный в виде функций высшего порядка в аналогичный ему SQL.


ГВ>Допустим, но что это меняет?


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

ГВ>Не думаешь же ты, надеюсь, что раз Haskell, то сразу малиновые штаны?


Нет.

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


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

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


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

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

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

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


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

Если придерживаться твоей извращенной "логики" (в кавычках так как этот по сути алогизм), то можно заключить что ЛИНК, в первую очередь, предназначен для распределения вычислений по разным серверам, так как он позволяет это делать и есть люди которые этим пользуются.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[32]: Кстати
От: yuriylsh  
Дата: 25.11.09 17:15
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

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


Собственно, VladD2 это уже раскрывал в посте, на который ты отвечаешь:

... так же идею Expression tree смысл которой заключается в том, чтобы заставить компилятор генерировать не исполняемый код, а AST которое можно будет анализировать в рантайме.


А что дальше делать с полученным AST — это уже дело провайдера. Напрмер, реализовать LINQ to LLBLGen, LINQ to Twitter, LINQ to Google,...
Luck in life always exists in the form of an abstract class that cannot be instantiated directly and needs to be inherited by hard work and dedication.
Re[32]: Кстати
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 17:33
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Странно, я предполагал, что типы функций у LINQ такие:


L>
L>public static M<B> SelectMany<M, A, B>(this M<A> m, Func<A, M<B>> k)
L>


L>А он получается может что угодно возвращать?


Зачем что-то предполагать?
Скачай спецификацию C# 3.0.
Там в разделе "26.7.2 The query expression pattern" дано описание на чем основан паттерн. А в разделе "26.7 Query expressions" то как синтаксис переписывается в этот паттерн.

Ну, и надо так же понимать, что ЛИНК — это торговая марка под которой нет четкого определения.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Кстати
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.09 17:37
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

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


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


Тебя просили дать определение, а не ключевой признак неизвестно чего.

Кстати, фраза "отсутствие связей внутри отношения" звучит как белиберда.

Про теорию "РСУБД" тоже очень интересно было бы послушать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: Кстати
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.09 17:55
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Скачай спецификацию C# 3.0.

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