Здравствуйте, 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>С твоим подходом придется на ровном месте плодить простыни кода.
Поверх целевого кода?
Не придётся.