Очередной Y-комбинатор на C#
В ходе всё ещё тщетных попыток написать на C# типизированную версию клёвого и особо опасного для мозга U-комбинатора (Y-комбинатор без рекурсии):
Y = (λh.λF.F(λx.((h(h))(F))(x))) (λh.λF.F(λx.((h(h))(F))(x)))
Получился забавный Y-комбинатор тоже без рекурсии, с рекурсивным типом-делегатом, стало жалко выбрасывать, решил положить здесь:
delegate β ƒ<α, β>(α x);
delegate α γ<α>(γ<α> f);
static ƒ<α, β> Y<α, β>(ƒ<ƒ<α, β>, ƒ<α, β>> f) {
return new γ<ƒ<α, β>>(h => F => f(h(h))(F))(h => F => f(h(h))(F));
}
Осталось взять всеми любимый факториал с аргументами в каррированной форме:
static ƒ<int, int> Fact(ƒ<int, int> fact) {
return n => (n == 0) ? 1 : n * fact(n - 1);
}
И скормить его комбинатору:
var fact = Y<int, int>(Fact);
Console.WriteLine("fact(6) = {0}", fact(6));
Поздравляю, теперь вы вооружены на случай, если из C# когда-нибудь дропнут рекурсивные вызовы :)
p.s. U-комбинатор по прежнему в поиске своего типизированного аналога!