суббота, 2 октября 2021 г.

Каррирование и декаррирование

 Немного красивой функциональщины на c#. Функторы каррирования и декаррирования:


    public static class Functors

    {

        public static Func<X, Func<Y, Z>> Currying<X, Y, Z>(this Func<X, Y, Z> f) => (x) => (y) => f(x, y);

        public static Func<X, Y, Z> UnCurrying<X, Y, Z>(this Func<X, Func<Y, Z>> f) => (x, y) => f(x)(y);

    }

Эффект основан на том, что между следующими множествами есть взаимно-однозначное соответствие:
А само это соответствие и есть функции каррирования и декаррироания.
Особенно интересно, что в теории множеств "скобочки в степенях" раскрываются также как и в обычной  арифметики.
Жаль, что c# не поддерживает переменное число типов-параметров, для обобщения на произвольное количество аргументов.