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, а в компиляторе ?

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