Re[54]: The door
От: vdimas Россия  
Дата: 19.07.18 13:41
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Y-комбинатор это Expression. Ты же показал Statement


Анонимную рекурсивную ф-ию создать нельзя.
Если нет имени, то как сослаться на такую ф-ию? ))

Давай присвоим ей имя:
    public static class ArrayExtensions
    {
        public static ArraySegment<T> Slice<T>(this T[] array, int index, int count)
            => new ArraySegment<T>(array, index, count);
    }
    ...
        static void Main(string[] args)
        {
            var source = new int[] { 1, 3, 2, 1, 2, 1, 3 };

            IEnumerable<int> func(int i) =>
                (i > source.Length - 2)
                ? source.Slice(source.Length - 1, 1)
                : from n in source.Slice(i, 2)
                  from m in func(i + 1)
                  select m * n;

            foreach (var x in func(0))
                Console.WriteLine(x);
        }



I>Лямда рекурсивная в виде Expression возможна только и исключительно через Y-комбинатор.


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

Тогда уж можно внутри неименованной лямбды сделать именованную и ву а ля.

source.Select((int x) => { int fact(int y) => y<2?1:y*fact(y-1); return fact(x); });


Ты просил показать без Y-комбинатора?
Ну и вот. ))


I>С твоим подходом придется на ровном месте плодить простыни кода.


Поверх целевого кода?
Не придётся.
Отредактировано 19.07.2018 13:42 vdimas . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.