Re[23]: Я всё ж таки вот, о чём думаю
От: IT Россия linq2db.com
Дата: 24.11.09 05:47
Оценка: 2 (2)
Здравствуйте, Геннадий Васильев, Вы писали:

IT>>В общем, всё это уже становится не интересным. Где не работает Linq я тебе и сам могу сказать. Linq не работает на деревьях и иерархиях, там, где для обработки требуются рекурсивные алгоритмы.


ГВ>Ну — упс, приехали. А как же Linq2XML?


Иерархичность XML ограниченна — в ней отсутсвует рекурсивность. Такую структуру всегда можно светсти к реляционной (если я правильно понял использование этого термина Гипертоном).

Но если говорить о Linq2XML вообще, то лично мне его использование не очень импонирует. Толи я пока не научилься его использовать, толи его API действительно громоздок и неудобен.
Если нам не помогут, то мы тоже никого не пощадим.
Re[26]: LINQ только для РСУБД!
От: IT Россия linq2db.com
Дата: 24.11.09 05:51
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Что-то больше похоже на обратную ситуацию: что таки не всякий цикл по данным должен реализовываться LINQ-ом.


foreach — это классический цикл. Его оличие от for в наличии индекса, что легко можно симулировать. А отличие от while в том, что while работает не с перебором последовательности данных, а вообще с хрен знает чем.
Если нам не помогут, то мы тоже никого не пощадим.
Re[27]: LINQ только для РСУБД!
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 24.11.09 06:05
Оценка:
Здравствуйте, IT, Вы писали:

ГВ>>Что-то больше похоже на обратную ситуацию: что таки не всякий цикл по данным должен реализовываться LINQ-ом.

IT>foreach — это классический цикл. Его оличие от for в наличии индекса, что легко можно симулировать. А отличие от while в том, что while работает не с перебором последовательности данных, а вообще с хрен знает чем.

Скорее так — ни for, ни while не привязаны к перечислителю (это если мы о C-шных).
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[27]: LINQ только для РСУБД!
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 24.11.09 06:07
Оценка:
Здравствуйте, IT, Вы писали:

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


Можно более развёрнуто?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[27]: LINQ только для РСУБД!
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 24.11.09 06:20
Оценка:
Здравствуйте, IT, Вы писали:

IT>Я думаю, что примеры подобраны правильно, чтобы продемонстрировать нецелевое использование предмета обсуждения. Мы, в свою очередь, пытались доказать не то, что "Linq is the best of the best of the best", а показать, что с помощью Linq можно решать и такие задачи.


С этим никто и не спорил. Речь шла об основном назначении Linq.

IT>Если бы ГВ спросил меня как бы я решал подобную задачу в реальности, а не в сферичности, то я бы ответил, что скорее всего обошёлся бы банальным циклом, т.к. для меня важнее простота и гибкость кода.


Вот-вот. И тут как раз проходит граница практической применимости Linq. То, что его принципиально можно применить где угодно, ещё не означает, что его имеет смысл применять где угодно. Добавь сюда свои соображения относительно XML и что в сухом остатке? Правильно — табличное представление данных.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[28]: опечатка
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 24.11.09 06:22
Оценка:
ГВ>относительно XML...

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

IT>Я думаю, что примеры подобраны правильно, чтобы продемонстрировать нецелевое использование предмета обсуждения. Мы, в свою очередь, пытались доказать не то, что "Linq is the best of the best of the best", а показать, что с помощью Linq можно решать и такие задачи.


Как это вяжется с тем, что Linq, мол, предназначен для любых источников данных? Получается, что только для тех, которые сводятся к РСУБД-like.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[21]: Я всё ж таки вот, о чём думаю
От: Lloyd Россия  
Дата: 24.11.09 06:28
Оценка: 20 (1)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>...в порядке возрастания time. Некоторые содержат true в mark. Когда на вход поступает очередная запись с mark=true (обозначим её r0), нужно выдать на выход "самую старую" запись, пришедшую не ранее, чем за 30 минут. Задача усложняется тем, что совершенно не обязательно, что time будет выравнен по границе минуты, т.е. к индексу уже не привяжешься.


Оказалось не так уж сложно:
using System;
using System.Collections.Generic;
using System.Linq;

class Program {
    static void Main(string[] args) {
        var rs = GetData();
        var qrs = rs
            .AttachState(
                () => Enumerable.Empty<R>(),
                (r, prev) => prev.SkipWhile(_ => (r.Time - _.Time) > TimeSpan.FromMinutes(30)).Concat(new[] { r }),
                (r, state) => new { r, state }
            )
            .SkipWhile(_ => !_.r.Mark)
            .Select(_ => _.state)
            .First();

        foreach (var found in qrs)
            Console.WriteLine("{0}, {1}, {2}", found.Time, found.Value, found.Mark);
    }

    private static R[] GetData() {
        var rnd = new Random();
        var rs = new R[] { 
            new R {
                Time= DateTime.Today + new TimeSpan(0, 14, 00), 
                Value = rnd.Next(100), 
                Mark = false 
            },
            new R {
                Time= DateTime.Today + new TimeSpan(0, 15, 28), 
                Value = rnd.Next(100), 
                Mark = false 
            },
            new R {
                Time= DateTime.Today + new TimeSpan(0, 18, 20), 
                Value = rnd.Next(100), 
                Mark = false 
            },
            new R {
                Time= DateTime.Today + new TimeSpan(0, 27, 37), 
                Value = rnd.Next(100), 
                Mark = false 
            },
            new R {
                Time= DateTime.Today + new TimeSpan(0, 29, 59), 
                Value = rnd.Next(100), 
                Mark = false 
            },
            new R {
                Time= DateTime.Today + new TimeSpan(0, 32, 28), 
                Value = rnd.Next(100), 
                Mark = false 
            },
            new R {
                Time= DateTime.Today + new TimeSpan(0, 55, 32), 
                Value = rnd.Next(100), 
                Mark = true 
            },
        };
        return rs;
    }
}

public static class StateEnumerableExtensions {
    public static IEnumerable<TResult> AttachState<T, TState, TResult>(
        this IEnumerable<T> source,
        Func<TState> getInitialState,
        Func<T, TState, TState> getNextState,
        Func<T, TState, TResult> selector
    ) {
        var state = getInitialState();
        foreach (var item in source) {
            state = getNextState(item, state);
            yield return selector(item, state);
        }
    }
}

class R {
    public DateTime Time { get; set; }
    public int Value { get; set; }
    public bool Mark { get; set; }
}
Re[27]: LINQ только для РСУБД!
От: Lloyd Россия  
Дата: 24.11.09 06:47
Оценка:
Здравствуйте, IT, Вы писали:

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


А их разве нет?

Func<int> getInt = () => 100;
Re[22]: Я всё ж таки вот, о чём думаю
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 24.11.09 06:50
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Оказалось не так уж сложно:


Я правильно понял, что здесь два перечислителя по последовательности бегают?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[23]: Я всё ж таки вот, о чём думаю
От: Lloyd Россия  
Дата: 24.11.09 06:54
Оценка: 1 (1)
Здравствуйте, Геннадий Васильев, Вы писали:

L>>Оказалось не так уж сложно:


ГВ>Я правильно понял, что здесь два перечислителя по последовательности бегают?


Нет, только один + таскается состояние (предшествующие елементы, не старее 30 минут от текущего).
Re[28]: LINQ только для РСУБД!
От: IT Россия linq2db.com
Дата: 24.11.09 07:18
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

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


ГВ>Можно более развёрнуто?


Иерархии обрабатываются рекурсивными алгоритмами. В C# сегодня это либо члены класса, но для этого нужно состояние либо выносить в класс, либо городить огород из длинного списка параметров. Либо эмулировать локальные функции делегатами, вроде этого:

void Foo()
{
    Func<int,int> bar; bar = n =>
    {
        // ...
        bar(n + 1);
    };

    var y = bar(1);
}

Громоздко и некрасиво, особенно, если нужны вложенные функции.
Если нам не помогут, то мы тоже никого не пощадим.
Re[28]: LINQ только для РСУБД!
От: IT Россия linq2db.com
Дата: 24.11.09 07:25
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Вот-вот. И тут как раз проходит граница практической применимости Linq. То, что его принципиально можно применить где угодно, ещё не означает, что его имеет смысл применять где угодно. Добавь сюда свои соображения относительно XML и что в сухом остатке? Правильно — табличное представление данных.


Ключевое слово другое, Гена. Не таблицы, а последовательности. Я уже устал это повторять, но повторюсь ещё раз. Подумай, зачем в C# добавили цикл foreach, который мгновенно стал одним из самых используемых. Так вот Linq применим везде, где применим foreach и даже в большем числе сценариев. При этом всё, что мы тут продемонстрировали из Linq в ФП две функции: iter и filter. Гапертону это отлично известно. Если ему это не известно, то либо Эрланг не функциональный язык, либо Гапертон врёт, что он его интенсивно использовал в своей команде.
Если нам не помогут, то мы тоже никого не пощадим.
Re[28]: Кстати
От: IT Россия linq2db.com
Дата: 24.11.09 07:29
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

IT>>Я думаю, что примеры подобраны правильно, чтобы продемонстрировать нецелевое использование предмета обсуждения. Мы, в свою очередь, пытались доказать не то, что "Linq is the best of the best of the best", а показать, что с помощью Linq можно решать и такие задачи.


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


Ты можешь дать определение РСУБД-like типам данных? Гапертон не смог.
Если нам не помогут, то мы тоже никого не пощадим.
Re[28]: LINQ только для РСУБД!
От: IT Россия linq2db.com
Дата: 24.11.09 07:36
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


L>А их разве нет?


L>
L>Func<int> getInt = () => 100;
L>

Это эмуляция, на которую грустно смотреть.

Во-первых, при рекурсии тебе понадобится разбить объявление и инициализацию getInt и таким образом добавить лишний мусор в код.
Во-вторых, этот мусор многократно усугубляется с вложенностью.
Если нам не помогут, то мы тоже никого не пощадим.
Re[27]: LINQ только для РСУБД!
От: Gaperton http://gaperton.livejournal.com
Дата: 24.11.09 08:28
Оценка:
Здравствуйте, IT, Вы писали:

IT>

IT>Вышли из леса суровые русские мужики и увидели японскую бензопилу.
IT>- А-а, б**! — сказали суровые русские мужики и засунули в пилу щепку.
IT>- Вжик! — сказала пила и распилила щепку.
IT>- У-у, б**! — сказали суровые русские мужики и засунули в пилу доску.
IT>- Вжжик! — сказала пила и распилила доску.
IT>- У-у, б**! — сказали суровые русские мужики и засунули в пилу бревно.
IT>- Вжжжжик! — сказала пила и распилила бревно.
IT>- У-у, б**!!! — сказали суровые русские мужики и засунули в пилу рельс.
IT>- Хррр-дзинь — сказала пила и сломалась.
IT>- А-а, б**... — сказали суровые русские мужики и пошли валить лес топорами.


Да, мы такие
Re[26]: LINQ только для РСУБД!
От: Gaperton http://gaperton.livejournal.com
Дата: 24.11.09 09:13
Оценка:
Здравствуйте, no4, Вы писали:

IT>>Я бы не стал судить о технологии на основании примеров, которые подбирались специально, чтобы посмотреть на неё в сценариях с нецелевым использованием.


no4>И еще — не доказывают ли примеры, что lisp comprehensions в haskell были созданы для работы с РСУБД, но по какой-то странной ошибке природы они с ними работать не умеют?


Нет, не доказывают. В основе list comprehensions лежит ZF-нотация, и применяются они для компактной записи создания объектов. В некоторых языках, к примеру, в близком к хаскелю Clean, они могут применяться не только для создания, но и для модификации элементов массивов, заменяя собой циклы с независимыми итерациями.

И, кстати, по странной ошибке природы, в некоторых языках местами умеют в том числе и работать с СУБД, и вообще работать с произвольным источником. Например, в Эрланге. См. Query List Comprehensions. http://erlang.org/doc/man/qlc.html

Что к сути дискуссии не имеет никакого отношения, на самом деле. Ты в этой сути разобрался бы, прежде чем с комментами влезать в ее окончание.
Re[28]: LINQ только для РСУБД!
От: Gaperton http://gaperton.livejournal.com
Дата: 24.11.09 09:17
Оценка:
Здравствуйте, Lloyd, Вы писали:

G>>И второе — да, я таки считаю, что отчасти линк используют на ровном месте просто "потому, что это круто".


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


L>Теперь посмотри на это со стороны. Не находишь картинку несколькой странной и наталкивающей на размышления?


Я нахожу весьма странным, и наталкивающим на размышления, что вместо демонстрации примеров, убедительно показывающих, почему же люди используют линк, тебе оказывается проще перевести разговор на обсуждение моей личности.
Re[29]: LINQ только для РСУБД!
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 24.11.09 09:59
Оценка:
Здравствуйте, IT, Вы писали:

IT>Ключевое слово другое, Гена. Не таблицы, а последовательности.


Мне кажется, что LINQ не ограничен последовательностями. Область применения LINQ — любое отображение, сохраняющее структуру (в частности, композицию морфизмов), т.е. функтор. Если же этот функтор является сопряжением функторов — монадой (например, unit этого сопряжения как раз будет unit-ом монады), то мы ещё можем пользоваться операцией SelectMany. Если размышлять об отображении как о монаде тяжело, то можно посмотреть на это отображение, как на моноид в категории эндофункторов. Тогда reasoning будет чуть проще.

Например, функция от аргумента известного типа, результат которой имеет отображаемый тип — вполне может быть типом для LINQ, как и последовательность, дерево и прочие контейнерные типы.

Поэтому применять LINQ, мне кажется, можно в тех местах, где заранее неизвестен тип, над которым LINQ работает, т.е. в полиморфных функциях.

Вытаскиваем значения из отображений отображений:

m => from sub in m from val in sub select val


Лифтим функцию над значениями в функцию над отображениями

f, m1, m2, m3 => from x1 in m1 from x2 in m2 from x3 in m3 select f(x1,x2,x3)


и т.п. Забесплатно — кучу функций над разными типами, лёгкий equational reasoning.
Теперь что касается синтаксиса LINQ, то преимущества здесь ровно те же, что и у do-синтаксиса в Haskell

m1.SelectMany(x1 => m2.SelectMany(x2 => m3.Select(x3 => f(x1, x2, x3)))


кажется не таким наглядным. Только вы же не о синтаксисе здесь спорите?
Re[29]: LINQ только для РСУБД!
От: Gaperton http://gaperton.livejournal.com
Дата: 24.11.09 11:21
Оценка: +1
Здравствуйте, IT, Вы писали:

IT>Ключевое слово другое, Гена. Не таблицы, а последовательности. Я уже устал это повторять, но повторюсь ещё раз. Подумай, зачем в C# добавили цикл foreach, который мгновенно стал одним из самых используемых. Так вот Linq применим везде, где применим foreach и даже в большем числе сценариев. При этом всё, что мы тут продемонстрировали из Linq в ФП две функции: iter и filter. Гапертону это отлично известно.


Скажем так, пока вы ничего из ряда вон выходящего (то есть, превышающее возможности ФВП и comprehensions) не показали. При этом, comprehensions это по большей части стиль мышления, и переводится в цикл достаточно прямолинейно — не сильная потеря (выигрыш нагляден только при использовании ZF-notation).

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

IT>Если ему это не известно, то либо Эрланг не функциональный язык, либо Гапертон врёт, что он его интенсивно использовал в своей команде.


Не надо так говорить.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.