Re[41]: 2D-Linq и оптимизация цифровых фильтров - 3
От: IB Австрия http://rsdn.ru
Дата: 16.07.18 23:57
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Оу, смотрю, запутался в собственных показаниях напрочь. ))

Не, ты похоже даже прочитать правильно не смог =)

V>Судя по твоей писанине, тебе нравится обмениваться "любезностями" с колегами.

V>Показал себя еще тем любителем словесного БДСМ.
БДСМ? Не льсти себе, на сабмиссива ты не тянешь, просто жвачка на ботинке...
Мы уже победили, просто это еще не так заметно...
Re[56]: The door
От: IB Австрия http://rsdn.ru
Дата: 16.07.18 23:57
Оценка: -1
Здравствуйте, vdimas, Вы писали:

V>Инфа для чебурашек из далёких стран о правилах нашего мира:

V>- когда по рылу в ответ, то не считается.
Ты допрыгни сначала, чтоб в ответ... =) Из твоей коленно-локтевой позы-то все больше получается зад под пинок подставить, сложно мимо такой цели пройти

V>Угу, в сортах г-на разбираюсь так себе.

Ага, видно, что жрешь все подряд
Мы уже победили, просто это еще не так заметно...
Re[50]: The door
От: IB Австрия http://rsdn.ru
Дата: 17.07.18 00:42
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Ты показал умение написать слово "манипуляция" без грамматических ошибок, разве что.

Не, ну ты никогда не догоняешь, на тебя и не рассчитывал )

V>Манипуляция — это когда сознательно недоговаривают, врут, играют одновременно на неполной информации и на эмоциях.

Ага. Но я не буду здесь с тобой его обсуждать. Во первых, у тебя и за себя-то отвечать не очень получается, так что не фиг за других впрягаться. А во вторых, он большой мальчик, сможет сам за себя высказаться, если ему покажется, что я что-то обидное написал.

V>Это имеющиеся Enumerable и Queryable классы, плюс правила маппинга синтаксиса языка выражений на обычные методы или на методы расширений.

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

V>Т.е., прикладной контракт при вызове select протягивать банально некуда.

Вот тут я перестал понимать что и куда ты хочешь протянуть.

V>Этот контракт можно попытаться завернуть в саму "лямбду", т.е. манипулировать контрактом при каждом обращении к элементу.

V>Получается возврат на круги своя — ноль оптимизаций.
Пока ощущение, что ты что-то наизнанку вывернул. .Select() — и есть контракт, зачем и в какую лямбду его заворачивать?

V>Берем другую технику — накручиваем контракт поверх самих "коллекций", мол, тогда функциональность "контракта" работает однократно.

V>Здесь спотыкаемся о необходимость стирания типов.
V>Т.е., если типы не стирать, то комбинаторный взрыв из более-менее полной библиотеки оперируемых контрактов быстро улетит в бесконечность.
V>А если типы стирать, то всегда будет лишний боксинг.
Ты сейчас опять с кем-то у себя в голове разговаривал? )

V>Собсно, подробно на всё это я уже отвечал, но ты мне почему-то отписывался совсем по другому поводу.

Потому что твой ответ выглядит как поток сознания, имеющий мало отношения к делу.

IB>>Даже если бы тебе удалось придумать способ, который в десять раз быстрее чем то, что предложил Антон, то это все равно бы доказало его позицию.

V>При условии, если бы ему удалось придумать способ безопасного обхода массива.
Без всяких условий. Реализация целиком твоя, ему даже думать не надо.

V>Я несколько раз говорил это словами (тут же, по-идее, собрались люди, понимающие дотнете, не?)

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

V>Да без проблем, если бы такое разделение не нарушало бы прикладной контракт.

Каким образом и какой прикладной контракт оно нарушает?

V>Мои хелперы показали, почему это не линк. ))

Твои хелперы не показали ничего.

V>>>А затем спросил, зачем приписали то, что сделали (а написано было, помимо решения целевой задачи, примерно в 300 раз больше кода) св-вам именно линка?

IB>>А теперь вернемся к началу. Что такое "свойства именно линка"?
V>Давай вернёмся.
V>Это способ маппинга выражений языка запросов на методы объектов или на методы-расширения.
Вот щас совсем суть твоей претензии не ясна. Кто кому и чего по твоему приписывал?

V>Моё мнение тут простое — сам этот способ маппинга НЕ расширяемый, поэтому прикладной контракт "подавать" некуда.

Тебя не устраивает как query comprehension транслируется в вызовы методов, что ли?
Мы уже победили, просто это еще не так заметно...
Re[51]: The door
От: vdimas Россия  
Дата: 17.07.18 03:06
Оценка:
Здравствуйте, IB, Вы писали:

V>>Т.е., прикладной контракт при вызове select протягивать банально некуда.

IB>Вот тут я перестал понимать что и куда ты хочешь протянуть.

Ты и не понимал.


V>>Этот контракт можно попытаться завернуть в саму "лямбду", т.е. манипулировать контрактом при каждом обращении к элементу.

V>>Получается возврат на круги своя — ноль оптимизаций.
IB>Пока ощущение, что ты что-то наизнанку вывернул.

Продолжай делиться ощущениями.


IB>.Select() — и есть контракт


Аквариум для рыбок тоже дом, но попугаю в нём неудобно.
Дай предположу — потому что попугай не рыбка?


IB>зачем и в какую лямбду его заворачивать?


Зачем широкий контракт протягивать через узкий?
Действительно!
Хороший вопрос, кстате.


V>>Берем другую технику — накручиваем контракт поверх самих "коллекций", мол, тогда функциональность "контракта" работает однократно.

V>>Здесь спотыкаемся о необходимость стирания типов.
V>>Т.е., если типы не стирать, то комбинаторный взрыв из более-менее полной библиотеки оперируемых контрактов быстро улетит в бесконечность.
V>>А если типы стирать, то всегда будет лишний боксинг.
IB>Ты сейчас опять с кем-то у себя в голове разговаривал? )

Ты бы почитал вводную по C#, если уж решил в этом топике отметиться.


V>>Собсно, подробно на всё это я уже отвечал, но ты мне почему-то отписывался совсем по другому поводу.

IB>Потому что твой ответ выглядит как поток сознания, имеющий мало отношения к делу.

Так ты почитай, почитай.
Откроешь для себя много интересного.


IB>>>Даже если бы тебе удалось придумать способ, который в десять раз быстрее чем то, что предложил Антон, то это все равно бы доказало его позицию.

V>>При условии, если бы ему удалось придумать способ безопасного обхода массива.
IB>Без всяких условий.

Это пусть решают более компетентные люди.
А ты пока сиди и пытайся разобраться.


V>>Я несколько раз говорил это словами (тут же, по-идее, собрались люди, понимающие дотнете, не?)

V>>Пришлось даже написать в чём проблема, и внятной реакции на это до сих пор не вижу.
IB>Да, в дотнете люди понимают, а вот в твоих тараканах желающих разбираться нет, поэтому и сидишь как дурак, обиженый и всеми не понятый.

"Тараканы", "дурак", "обиделся", "потоки сознания"...
Сколько беготни-то от простых вещей.

Вот простой код:
    int _x;
    public int x => (_x++)/100;
    ...
    from d in data select (d[-x, 0] + d[x, 0] + ...

Судя по твоей реакции, ты его либо ниасилил, либо этот код тебе крайне неприятен.

Ни в том ни в другом признаться духа нет, страдаешь аки капризное тепличное растение.


IB>и единственное что удается из них понять, что они про что-то другое. И то, только когда до кода доходит.


Очевидно, что ты не понял вообще ничего, если продолжаешь заполнять паузу бесполезным трёпом.

Будь мужиком, скажи прямой речью: "я не понимаю, в чём заключается проблема в приведенном сниппете".
Поржом да разойдёмся.
Отредактировано 17.07.2018 3:07 vdimas . Предыдущая версия .
Re[57]: The door
От: vdimas Россия  
Дата: 17.07.18 03:37
Оценка:
Здравствуйте, IB, Вы писали:

V>>Инфа для чебурашек из далёких стран о правилах нашего мира:

V>>- когда по рылу в ответ, то не считается.
IB>Ты допрыгни сначала, чтоб в ответ...

Приедь, допрыгну.
Re[55]: The door
От: Sharov Россия  
Дата: 17.07.18 08:56
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Expression<Func<TSource, TResult>> selector

V>vs
V>Func<TSource, TResult> selector

V>В первом случае компилятор вернет дерево выражений, а во втором сгенерит код.


Да, но в обоих случаях программист напишет одну и ту же лямбду.
Кодом людям нужно помогать!
Re[54]: The door
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.07.18 09:01
Оценка: +2 :)
Здравствуйте, vdimas, Вы писали:

V>>>Это разные вещи.

I>>Ты упорный нечитатель. Одно высказывание от ИТ, второе — как его понял alex_public.

V>Даже не берясь судить, что Алекс имел ввиду, его утверждение является истинной.


Это блеск!

V>>>- ввиду того, что лямбды унутре выполнены как обычные объекты-замыкания, Y-комбинатор не нужен, достаточно обычной рекурсии в методе такого объекта.

V>>>Шах и мат. ))
I>>Покажи код, как без Y-комбинатора писать рекурсию в лямда-выражениях.

V>Я правильно понял твой вопрос, что ты хочешь посмотреть на некий гипотетический синтаксис выражений linq и соотв. сгенерённый компилятором объект-замыкание?


Нет, конечно. Я говорю о фактическом положении дел и о причинно-следственных связях. То есть, поскольку C# не умеет такую рекурсию иначе как через Y-комбинатор, следствием является отсутствие внятного реализации CTE.
То есть, все просто — никто не хочет мучиться, выписывая непойми что. И причина никак не в Linq.

I>>Ради чего ты тужился тогда ? "Я тоже так могу" ?


V>Там чёрным по-белому написано ради чего — посмотреть, насколько это практично.

V>Из-за двух лишних уровней косвенности описания, делающих невозможным автовывод типа делегата — получается абсолютно не практично.

То есть, тебе понятно, что причина не в LINQ, а в компиляторе ?
Re[46]: The door
От: alex_public  
Дата: 17.07.18 11:26
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Я уже похожим вопросом задавался -- http://rsdn.org/forum/dotnet/7184882.1
Автор: Sharov
Дата: 29.06.18


А, понял, извини — я эту темку пролистал мельком, так что не заметил что это сообщение написал тоже ты и в итоге неправильно понял твою позицию.
Re[55]: The door
От: vdimas Россия  
Дата: 17.07.18 13:30
Оценка:
Здравствуйте, Ikemefula, Вы писали:

V>>Даже не берясь судить, что Алекс имел ввиду, его утверждение является истинной.

I>Это блеск!

Это как "устами младенца ..." и далее про тексту.
Так бывает.


I>>>Покажи код, как без Y-комбинатора писать рекурсию в лямда-выражениях.

V>>Я правильно понял твой вопрос, что ты хочешь посмотреть на некий гипотетический синтаксис выражений linq и соотв. сгенерённый компилятором объект-замыкание?
I>Нет, конечно.

Тогда ты тоже лишь бесполезно трепешься.


I>Я говорю о фактическом положении дел и о причинно-следственных связях.


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


I>То есть, поскольку C# не умеет такую рекурсию иначе как через Y-комбинатор, следствием является отсутствие внятного реализации CTE.


C# умеет обычную рекурсию, этого достаточно.

С++ тоже умеет, поэтому рекурсивная лямбда на ём тривиальна:
    std::function<int (int)> foo = [&foo](int k) {
        return k == 1 ? 1 : k + foo(k-1);
    };


I>То есть, все просто — никто не хочет мучиться, выписывая непойми что.


И что тебе непонятно в этой записи?
    Func<int, int> foo = (int k) => {
        return k == 1 ? 1 : k + foo(k-1);
    };

Компилятор тут ругается.

А вот так нет:
    Func<int, int> foo = null;

    foo = (int k) => {
        return k == 1 ? 1 : k + foo(k - 1);
    };


Хотя видно, что вызова лямбды нет до окончания определения переменной.


I>И причина никак не в Linq.


Не отмазывайся. ))
Linq генерит теля лямбд.
САМ!
Хреново генерит.

И так во многом в C#.
Взять даже банальные IReadOnlyDictionary<>, IReadOnlyollection<>.
Не прошло и 10-ти лет как выяснилось, что нужны были именно они в кач-ве интерфейсов, а не IDictionary и не ICollection, которые теперь как гиря на ногах.


V>>Там чёрным по-белому написано ради чего — посмотреть, насколько это практично.

V>>Из-за двух лишних уровней косвенности описания, делающих невозможным автовывод типа делегата — получается абсолютно не практично.
I>То есть, тебе понятно, что причина не в LINQ, а в компиляторе ?

То есть ты ерунду продолжаешь говорить, сорри.
Я уже всё показал, вроде бы.
Re[56]: The door
От: vdimas Россия  
Дата: 17.07.18 14:13
Оценка:
Здравствуйте, Sharov, Вы писали:

V>>В первом случае компилятор вернет дерево выражений, а во втором сгенерит код.

S>Да, но в обоих случаях программист напишет одну и ту же лямбду.

Но двух таких разных случаев вынужден будет написать две копипасты. ))
Re[57]: The door
От: Sharov Россия  
Дата: 17.07.18 14:16
Оценка:
Здравствуйте, vdimas, Вы писали:

S>>Да, но в обоих случаях программист напишет одну и ту же лямбду.


V>Но двух таких разных случаев вынужден будет написать две копипасты. ))


Не понял...
Кодом людям нужно помогать!
Re[58]: The door
От: vdimas Россия  
Дата: 17.07.18 14:42
Оценка:
Здравствуйте, Sharov, Вы писали:

S>>>Да, но в обоих случаях программист напишет одну и ту же лямбду.

V>>Но двух таких разных случаев вынужден будет написать две копипасты. ))
S>Не понял...

Я говорю — нет повторного использования кода.
Каждый такую лямбду надо будет писать заново.

Поэтому, такая же она или чуть отличается — уже не принципиально.
Re[59]: The door
От: Sharov Россия  
Дата: 17.07.18 14:55
Оценка:
Здравствуйте, vdimas, Вы писали:

S>>Не понял...


V>Я говорю — нет повторного использования кода.

V>Каждый такую лямбду надо будет писать заново.

Лябды идентичны, зачем заново?
Кодом людям нужно помогать!
Re[52]: The door
От: alex_public  
Дата: 17.07.18 15:16
Оценка:
Здравствуйте, vdimas, Вы писали:

V>- ср-ва для обхода ограничения на рекурсию лямбд в языке есть — это известный Y-комбинатор.

V>- язык запросов linq вполне мог бы реализовать его прозрачно для программиста... но! даже этого не требуется!
V>- ввиду того, что лямбды унутре выполнены как обычные объекты-замыкания, Y-комбинатор не нужен, достаточно обычной рекурсии в методе такого объекта.

Для записи рекурсивной лямбды на C# никакие Y-комбинаторы не нужны. Достаточно написать так:
Func<int, int> f=null;
f=n=>{
    if(n<2) return 1;
    return n*f(n-1);
};

полностью аналогично (только более прилично) это же самое записывается и на C++:
function<int(int)> f=[&](auto n){
    if(n<2) return 1;
    return n*f(n-1);
};

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

Если данный стандартный способ "почему-то" не подходит для использования в Linq и для него требуется притаскивать кривую хрень из лямбда-исчисления под названием Y-комбинатор, то это означает только лишь проблемы в устройстве Linq, а не какие-то проблемы с рекурентными лямбдами в C#.

Кстати, этот самый Y-комбинатор задаётся в C++ в одну строчку:
template<typename T> function<T(T)> y(function<T(T, function<T(T)>)> f) {return bind(f, placeholders::_1, bind(y<T>, f)); }

так что потом можно писать так:
auto f=y<int>([](auto n, auto self){
    if(n<2) return 1;
    return n*self(n-1);
});

что очевидно и менее удобно и менее эффективно (ещё больше std::function), чем вариант выше.

Современный C++ позволяет реализовать ещё одно интересное решение, с близким внешне подходом:
auto f=[](auto n){
    auto impl=[](auto n, auto self){
        if(n<2) return 1;
        return n*self(n-1, self);
    };
    return impl(n, impl);
};

здесь код стал ещё чуть менее красивым, зато он намного эффективнее чем все предыдущие, т.к. вообще нет косвенности от std::function/делегатов, плюс он остался обобщённым (f — в последнем примере является полиморфной лямбдой). Т.е. здесь хотя бы есть какая-то польза от усложнения записи.

P.S. А вообще я удивляюсь твоему желанию тратить время на некоторых бесполезных персонажей данного форума.
Re[53]: The door
От: vdimas Россия  
Дата: 17.07.18 15:23
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Для записи рекурсивной лямбды на C# никакие Y-комбинаторы не нужны. Достаточно написать так:


Ага, именно это же я это рядом и написал:
http://www.rsdn.org/forum/dotnet/7199059.1

И по плюсам тоже.


_>Если данный стандартный способ "почему-то" не подходит для использования в Linq и для него требуется притаскивать кривую хрень из лямбда-исчисления под названием Y-комбинатор, то это означает только лишь проблемы в устройстве Linq, а не какие-то проблемы с рекурентными лямбдами в C#.


_>Кстати, этот самый Y-комбинатор задаётся в C++ в одну строчку:

_>template<typename T> function<T(T)> y(function<T(T, function<T(T)>)> f) {return bind(f, placeholders::_1, bind(y<T>, f)); }

На С++14 можно просто через auto.


_>Современный C++ позволяет реализовать ещё одно интересное решение, с близким внешне подходом:

_>auto f=[](auto n){

хаха
С тобой спорить не интересно, бо спора не получается, драмы нет. ))


_>P.S. А вообще я удивляюсь твоему желанию тратить время на некоторых бесполезных персонажей данного форума.


Это не только для них.
Re[60]: The door
От: vdimas Россия  
Дата: 17.07.18 15:48
Оценка:
Здравствуйте, Sharov, Вы писали:

V>>Я говорю — нет повторного использования кода.

V>>Каждый такую лямбду надо будет писать заново.
S>Лябды идентичны, зачем заново?

Копипастить всё-равно надо.
Re[54]: The door
От: alex_public  
Дата: 17.07.18 15:53
Оценка:
Здравствуйте, vdimas, Вы писали:

_>>Для записи рекурсивной лямбды на C# никакие Y-комбинаторы не нужны. Достаточно написать так:

V>Ага, именно это же я это рядом и написал:
V>http://www.rsdn.org/forum/dotnet/7199059.1
V>И по плюсам тоже.

О, и даже в качестве примеров тот же факториал... Забавно. ))) Я этого твоего сообщения не видел, когда своё писал. Надо было мне подождать до вечера и тогда бы можно было вообще ничего не писать. )))

_>>Кстати, этот самый Y-комбинатор задаётся в C++ в одну строчку:

_>>template<typename T> function<T(T)> y(function<T(T, function<T(T)>)> f) {return bind(f, placeholders::_1, bind(y<T>, f)); }
V>На С++14 можно просто через auto.

Если ты про возвращаемое значение, то не получится, потому как bind выводит свой тип из параметров, а там опять же "y" стоит — получается кольцо. Но в данном случае это не принципиально, т.к. auto здесь только для сокращения записи было бы.
Re[61]: The door
От: Sharov Россия  
Дата: 17.07.18 16:19
Оценка:
Здравствуйте, vdimas, Вы писали:



V>Копипастить всё-равно надо.


IQuerable наследует IEnumerable, если что.
Кодом людям нужно помогать!
Re[53]: The door
От: IB Австрия http://rsdn.ru
Дата: 17.07.18 17:32
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Для записи рекурсивной лямбды на C# никакие Y-комбинаторы не нужны. Достаточно написать так:

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

Напомню, в оригинале требовалось написать рекурсивную лямбду в одно выражение. Здесь два.
То есть диалог опять выглядит следущим образом:
— Для записи лямбды в одно выражение нужен Y-комбинатор, это неудобно.
— Можно и без, вот же, но если ваш линк так не умеет, то это он виноват.
— Здесь два выражения, и причем тут линк?
Ну и кто здесь пытается доказать что-то странное?

_>Если данный стандартный способ "почему-то" не подходит для использования в Linq и для него требуется притаскивать кривую хрень из лямбда-исчисления под названием Y-комбинатор, то это означает только лишь проблемы в устройстве Linq, а не какие-то проблемы с рекурентными лямбдами в C#.

Я могу еще раз повторить, что и в linq данный способ подходит, он не подходит по условиям задачи. Могу еще раз ссылочки на статьи дать, где рассказывается про сложности с рекурсивной лямбдой в выражении, в C#, если в прошлый раз прочитать не получилось. Напоминаю, в C#, не в linq.

_>P.S. А вообще я удивляюсь твоему желанию тратить время на некоторых бесполезных персонажей данного форума.

Действительно, вопросы неудобные задают, на ошибки указывают, к формулировкам докапываются — что за люди?
Мы уже победили, просто это еще не так заметно...
Re[52]: The door
От: IB Австрия http://rsdn.ru
Дата: 17.07.18 18:04
Оценка: +1 :)
Здравствуйте, vdimas, Вы писали:

V>Ты и не понимал.

Да уж куда мне... =) Но видишь ли в чем дело — это не моя проблема, а твоя. Это ты не в состоянии свою мысль внятно и развернуто донести.
Ну а раз не можешь — сиди и отбрехивайся... Хотя и это у тебя что-то не очень получается )

V>Будь мужиком, скажи прямой речью: "я не понимаю, в чём заключается проблема в приведенном сниппете".

Так я тебе прямо сразу и сказал — ты пишешь полную хрень, которую невозможно понять. Кто мужик? Я мужик! =)
Более того, ты не в состоянии ответить ни на один уточняющий вопрос. Все попытки выяснить что же ты имеешь ввиду, приводят к хамству и оскорблениям. Вот и сейчас — ни на один вопрос внятно не ответил, только нахамил.
Блестяще перевел разговор из технической области на личность собеседника, но тут тебе тоже ничего не светит Интересно, как быстро ты меня в гости пригласишь в этот раз? ))

V>Поржом да разойдёмся.

Я уже давно ржу и расхожусь
Мы уже победили, просто это еще не так заметно...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.