лямбда-исчисление для функционального программирования
-
12-09-2019 - |
Вопрос
в лямбда-исчислении (λ x.λ у.λ с.λ з.x s (y s z)) используется для сложения двух чисел Чёрча, как мы можем это объяснить, есть ли какой-нибудь хороший ресурс по лямбда-исчислению для функционального программирования?ваша помощь очень ценна
Решение
На самом деле λ f1.λ f2.λ с.λ з.(f1 s (f2 s z)) вычисляет сложение, поскольку оно фактически заменяет (f2 s z), число, представленное f2, на «ноль» внутри (f1 s z).
Пример:Возьмем двоих для f2, s s z
в развернутом виде.f1 один: s z
.Замените это последнее z
по f2 и вы получите s s s z
, развернутая форма на троих.
Простите, с доской и помахиванием руками было бы проще.
Другие советы
В лямбда-исчислении вы кодируете тип данных с точки зрения операций, которые он вызывает.Например, логическое значение — это просто функция выбора, которая принимает на вход два значения a и b и возвращает либо a, либо b:
true = \a,b.a false = \a,b.b
Каково использование натурального числа?Его основная вычислительная цель - обеспечить границу с итерацией.Таким образом, мы кодируем естественное число как оператор, который принимает входную функцию F, значение x, и идентифицируя применение F в течение X для N Times:
n = \f,x.f(f(....(f x)...))
с n вхождениями f.
Теперь, если вы хотите итерации N + M, раз в то время как функция F, начинающаяся с x, вы должны начать итерацию n раз, то есть (NFX), а затем итерация для M Дополнительные времена, начиная с предыдущего результата, то есть
m f (n f x)
Точно так же, если вы хотите итерации n*m раз, вам нужно итерации M, раз расточив работу итерации N Times f (как в двух вложенных петлях), то есть
m (n f) x
Предыдущее кодирование данных дата более формально объясняется с точки зрения конструкторов и соответствующих элиминаторов (так называемый кодирование Bohm-berarducci).