Сообщение 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>У тебя не получается эту достаточность продемонстрировать.
Уже продемонстрировал:
I>Вот я могу такой код писать return source.Where(x=>SomeFilter(x)).Select(x=>SomeProjector(x))
I>Как твоим методом добавить сюда рекурсивные вызовы ?
Точно так же:
Первый раз показал по обычной ф-ии, теперь по последовательностям.
Здесь прямо в момент генерации этой последовательности прямо по ней же происходит поиск дубликатов в духе маляра Шлемиэля.
Выведет:
I> Может тебе определиться, откуда растут проблемы с рекурсей, из Линка или C#. У тебя, похоже, ответ от настроения зависит.
Похоже, ты тщательно стараешься не быть объективным. ))
ОК, пусть даже мы хотим избежать серьёзного изменения в языке C# по историческим причинам.
Но в линке-то появилось выражение let x = some_expression.
Из этого выражения генерится примерно такое тело делегата:
Вопрос:
что помешало сделать так:
и разрешить рекурсию прямо в выражениях?
V>>Взять даже банальные IReadOnlyDictionary<>, IReadOnlyollection<>.
V>>Не прошло и 10-ти лет как выяснилось, что нужны были именно они в кач-ве интерфейсов, а не IDictionary и не ICollection, которые теперь как гиря на ногах.
I>Разумеется, все это время менялось понимание парадигдмы.
Парадигма не поменялась.
Но именно интерфейсы оказались нужны только для перебора коллекции, а не для записи туда значений.
Причём, в обычном коде тоже, не только в линке.
I>Если это всё, ты пока ничего не показал.
Скучно тебе, смотрю, без моей прямой речи?
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>У тебя не получается эту достаточность продемонстрировать.
Уже продемонстрировал:
I>Вот я могу такой код писать return source.Where(x=>SomeFilter(x)).Select(x=>SomeProjector(x))
I>Как твоим методом добавить сюда рекурсивные вызовы ?
Точно так же:
Первый раз показал по обычной ф-ии, теперь по последовательностям.
Здесь прямо в момент генерации этой последовательности прямо по ней же происходит поиск дубликатов в духе маляра Шлемиэля.
Выведет:
I> Может тебе определиться, откуда растут проблемы с рекурсей, из Линка или C#. У тебя, похоже, ответ от настроения зависит.
Похоже, ты тщательно стараешься не быть объективным. ))
ОК, пусть даже мы хотим избежать серьёзного изменения в языке C# по историческим причинам.
Но в линке-то появилось выражение let x = some_expression.
Из этого выражения генерится примерно такое тело делегата:
Вопрос:
что помешало сделать так:
и разрешить рекурсию прямо в выражениях?
V>>Взять даже банальные IReadOnlyDictionary<>, IReadOnlyollection<>.
V>>Не прошло и 10-ти лет как выяснилось, что нужны были именно они в кач-ве интерфейсов, а не IDictionary и не ICollection, которые теперь как гиря на ногах.
I>Разумеется, все это время менялось понимание парадигдмы.
Парадигма не поменялась.
Но именно интерфейсы оказались нужны только для перебора коллекции, а не для записи туда значений.
Причём, в обычном коде тоже, не только в линке.
I>Если это всё, ты пока ничего не показал.
Скучно тебе, смотрю, без моей прямой речи?
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>Если это всё, ты пока ничего не показал.
Скучно тебе, смотрю, без моей прямой речи?