Информация об изменениях

Сообщение Re[57]: The door от 18.07.2018 9:53

Изменено 18.07.2018 9:59 vdimas

Re[57]: The door
Здравствуйте, Ikemefula, Вы писали:

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

V>>C# умеет обычную рекурсию, этого достаточно.
I>У тебя не получается эту достаточность продемонстрировать.

Уже продемонстрировал:
    Func<int, int> foo = null;

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


I>Вот я могу такой код писать return source.Where(x=>SomeFilter(x)).Select(x=>SomeProjector(x))

I>Как твоим методом добавить сюда рекурсивные вызовы ?

Точно так же:
        static bool RecursiveFilter(IEnumerable<int> values, int value, int index)
        {
            var enumerator = values.GetEnumerator();

            if (index == 0)
                return true;

            for (int i = 0; i < index - 1; i++)
            {
                enumerator.MoveNext();

                if (enumerator.Current == value)
                    return false;
            }

            return true;
        }

        static void RecursionTest()
        {
            int[] source = new int[] { 1, 3, 1, 2, 3, 1, 3, 2, 1 };
            IEnumerable<int> func = null;

            func = source.Where((x, index) => RecursiveFilter(func, x, index));

            foreach(var i in func)
                Console.WriteLine(i);
        }


Первый раз показал по обычной ф-ии, теперь по последовательностям.
Здесь прямо в момент генерации этой последовательности прямо по ней же происходит поиск дубликатов в духе маляра Шлемиэля.
Выведет:
1
3
2



I> Может тебе определиться, откуда растут проблемы с рекурсей, из Линка или C#. У тебя, похоже, ответ от настроения зависит.


Похоже, ты тщательно стараешься не быть объективным. ))

ОК, пусть даже мы хотим избежать серьёзного изменения в языке C# по историческим причинам.
Но в линке-то появилось выражение let x = some_expression.
Из этого выражения генерится примерно такое тело делегата:
...
var x = some_expression(other_variables);
...

Вопрос:
что помешало сделать так:
...
var x = default;
x = some_expression(other_variables);
...

и разрешить рекурсию прямо в выражениях?


V>>Взять даже банальные IReadOnlyDictionary<>, IReadOnlyollection<>.

V>>Не прошло и 10-ти лет как выяснилось, что нужны были именно они в кач-ве интерфейсов, а не IDictionary и не ICollection, которые теперь как гиря на ногах.
I>Разумеется, все это время менялось понимание парадигдмы.

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


I>Если это всё, ты пока ничего не показал.


Скучно тебе, смотрю, без моей прямой речи?
Re[57]: The door
Здравствуйте, Ikemefula, Вы писали:

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

V>>C# умеет обычную рекурсию, этого достаточно.
I>У тебя не получается эту достаточность продемонстрировать.

Уже продемонстрировал:
    Func<int, int> foo = null;

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


I>Вот я могу такой код писать return source.Where(x=>SomeFilter(x)).Select(x=>SomeProjector(x))

I>Как твоим методом добавить сюда рекурсивные вызовы ?

Точно так же:
        static bool RecursiveFilter(IEnumerable<int> values, int value, int index)
        {
            var enumerator = values.GetEnumerator();

            for (int i = 0; i < index - 1; i++)
            {
                enumerator.MoveNext();

                if (enumerator.Current == value)
                    return false;
            }

            return true;
        }

        static void RecursionTest()
        {
            int[] source = new int[] { 1, 3, 1, 2, 3, 1, 3, 2, 1 };
            IEnumerable<int> func = null;

            func = source.Where((x, index) => RecursiveFilter(func, x, index));

            foreach(var i in func)
                Console.WriteLine(i);
        }


Первый раз показал по обычной ф-ии, теперь по последовательностям.
Здесь прямо в момент генерации этой последовательности прямо по ней же происходит поиск дубликатов в духе маляра Шлемиэля.
Выведет:
1
3
2



I> Может тебе определиться, откуда растут проблемы с рекурсей, из Линка или C#. У тебя, похоже, ответ от настроения зависит.


Похоже, ты тщательно стараешься не быть объективным. ))

ОК, пусть даже мы хотим избежать серьёзного изменения в языке C# по историческим причинам.
Но в линке-то появилось выражение let x = some_expression.
Из этого выражения генерится примерно такое тело делегата:
...
var x = some_expression(other_variables);
...

Вопрос:
что помешало сделать так:
...
var x = default;
x = some_expression(other_variables);
...

и разрешить рекурсию прямо в выражениях?


V>>Взять даже банальные IReadOnlyDictionary<>, IReadOnlyollection<>.

V>>Не прошло и 10-ти лет как выяснилось, что нужны были именно они в кач-ве интерфейсов, а не IDictionary и не ICollection, которые теперь как гиря на ногах.
I>Разумеется, все это время менялось понимание парадигдмы.

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


I>Если это всё, ты пока ничего не показал.


Скучно тебе, смотрю, без моей прямой речи?