Y-combinator in C#
а я не понял в отличии от поставивших плюсы. можно немного более подробно, пожалуйста?
class Magic
{
void f(Magic& m);
void g(Magic* m);
void h(Magic m);
};
Я, наверно, просто не понял всю глубину мысли афтара
Буривуху: в каком статически типизированном языке лучше? Не считая хаскеля =)
Я не буду спорить, что на питоне это пишется гораздо проще, но тут меня в основном удивляет то, что получается полностью type-safe штука. Если подумать, то довольно очевидно, что система типов должна быть такой мощной, но для меня оказалось довольно неожиданным.
Батату, читай: http://en.wikipedia.org/wiki/Fixed_point_combinator#Y_combin...
Да не, я не претензии выражаю. Просто отвык уже
public delegate Fii Branch(Branch p);
я тут еще наткнулся на применение этого синтаксиса(вроде в этом треде не было) - анонимная рекурсия.
на примере вычисления Фибоначчи
delegate Func<A, R> Recursive<A, R>(Recursive<A, R> r);
Recursive<int, int> fibRec = f => n => n > 1 ? f(fn - 1) + f(fn - 2) : n;
Func<int, int> fib = fibRec(fibRec);
Console.WriteLine(fib(6;
подробнее почитать тут http://rsdn.ru/article/dotnet/cslambda.xml (там еще много интересного) и тут http://blogs.msdn.com/wesdyer/archive/2007/02/02/anonymous-r...
Оставить комментарий
bleyman
Собственно, вот.Забавно, по-моему. Написано по мотивам жавакода тут http://dtm.livejournal.com/36832.html
Да, забавность я вижу в том, что мне всегда казалось, что система типов в шарпе (и жаве, и вообще) достаточно проста и не позволяет делать типизированного лямбда-исчисления. А вот позволяет, оказывается, за счёт того, что можно объявить
public delegate Fii Branch(Branch p);
или, например,
public class Branch
{
public abstract Fii Apply(Branch b);
}
где формально получается рекурсивный тип — мы ещё не успели определить класс (или делегат а уже разрешаем получать его как параметр. В С такое невозможно, пришлось бы делать тайпкасты. Вот так-то!