В лямбда-исчислении вы кодируете тип данных с точки зрения операций, которые он вызывает. Например, логическое значение - это функция выбора, которая принимает на вход два значения a и b и возвращает либо a, либо b:
true = \a,b.a false = \a,b.b
Какая польза от натурального числа? Его основная вычислительная цель состоит в том, чтобы
обеспечить привязку к итерации. Итак, мы кодируем натуральное число как оператор
которая принимает на вход функцию f, значение x и выполняет итерацию приложения
f над x для n раз:
n = \f,x.f(f(....(f x)...))
с n вхождениями f.
Теперь, если вы хотите итерировать n + m раз функцию f, начиная с x
Вы должны начать итерацию n раз, то есть (n f x), а затем итерацию для m
дополнительное время, начиная с предыдущего результата, то есть
m f (n f x)
Точно так же, если вы хотите повторять n * m раз, вам нужно повторять m раз
операция итерации n раз f (как в двух вложенных циклах), то есть
m (n f) x
Предыдущая кодировка типов данных более формально объясняется в терминах
конструкторов и соответствующих элиминаторов (так называемый
Кодировка Бома-Берардуччи).