Забавный способ рассуждать

Я слышу это сейчас: «Ботан!»

Я думаю, что писать статью о лямбда-исчислении — глупо. Но выслушайте меня.

Я узнал о лямбда-исчислении в прошлом семестре. Это было рассмотрено в курсе под названием «Принципы языков программирования». Изучение этой формальной системы должно было помочь нам, студентам, понять функциональное программирование. Другими словами, чтобы освоиться с:

  • Программы, созданные путем применения функций вместо выполнения операторов в некотором порядке.
  • Функции, читающие другие функции в качестве аргументов.
  • Функции, возвращающие другие функции.

Лямбда-исчисление, безусловно, помогло мне в этом. Кроме того, это дало мне совершенно новый способ выражения программных конструкций.

Итак, давайте кратко поговорим о лямбда-исчислении и о том, чем оно полезно.

Что такое лямбда-исчисление?

Лямбда-исчисление было разработано Алонзо Чёрчем в 1930-х годах. Это система определения всего как функций. Объекты — это функции. Операции — это функции. Числа — это функции.

Это менее сложно, чем можно подумать.

Лямбда-исчисление следует определенным синтаксическим правилам для определения этих вещей. Допустимые выражения в лямбда-исчислении называются лямбда-термами. Они состоят из следующего:

Переменные

Это буквы или слова, такие как x и y, которые используются в качестве входных данных для функций.

Абстракции

Это функции, и их можно определить с помощью круглых скобок. Они следуют форме (λx.M), где M — лямбда-член. Например, (λx.t) задает функцию, которая считывает переменную x и возвращает переменную t.

Абстракции также можно писать без круглых скобок, например:
true ≡ λx.λy.x. Правая сторона такая же, как (λx.(λy.x)).

Эта абстракция определяет логическое значение true как функцию, которая:
— считывает переменную x.
— возвращает функцию, которая считывает вторую переменную y и возвращает первую переменную, Икс.

Приложения

Они представляют, как мы вызываем функции. Приложения имеют вид (M N), где M и N — лямбда-члены.

Давайте посмотрим на пример. Скажем, мы определили not ≡ λx.((x false) true). Как мы должны вычислить (not true)?

Калькулятор лямбда-исчисления дает нам решение в красивом стиле:

Во-первых, мы заменяем not его абстракцией или определением функции. Мы применяем его с вводом true. Это означает, что мы заменяем все экземпляры внешней переменной x на true. Это дает нам приложение: true false true или (true (false true)).

Далее действуем слева направо. Мы заменяем true его определением. Помните, что функция true считывает две переменные и возвращает первую. Здесь функция true считывает false, затем true. Таким образом, он возвращает false.

Это имеет смысл: (not true) действительно false.

Почему это полезно?

Лямбда-исчисление имеет множество приложений. Но поскольку я узнал об этом на уроке языков, я мог бы также рассказать о его использовании в этом отношении.

Вы только что видели, что логические значения можно представить в виде функций. Это потрясающе. Это значительно упрощает то, как мы можем думать о языках программирования. Логическое значение не обязательно должно рассматриваться как полностью отличное от числа или другого типа. Вместо этого мы можем рассматривать все как функции.

Это упрощает изучение языков программирования, таких как Lisp (или их диалектов, таких как Scheme). Рассмотрим следующий код схемы:

(((lambda (x) (lambda (y) (+ x y))) 5) 3)

Что оно делает?

  • Он определяет функцию, которая считывает переменную x. Назовем эту функцию внешней функцией. Эта функция возвращает новую внутреннюю функцию, которая считывает переменную y.
  • Внутренняя функция возвращает приложение: она суммирует x и y.
  • Мы вызываем нашу внешнюю функцию со значением 5 и нашу внутреннюю функцию со значением 3.
  • В итоге получаем (+ 5 3), что равно 8.

Этот код схемы очень похож на лямбда-исчисление. Функции вызываются с помощью круглых скобок. Функции могут читаться в терминах лямбда: переменные или другие функции. Это очень элегантно.

В этом мне помогло хорошее понимание лямбда-исчисления. Это также помогло мне понять, как использовать Scheme для представления более сложных вещей, таких как хэш-карты.

Итак, если вы заинтересованы в изучении функционального программирования, сначала попробуйте лямбда-исчисление.

Заключение

Вам не нужно лямбда-исчисление, чтобы освоить функциональное программирование. Но я думаю, что лямбда-исчисление дает нам аккуратный способ думать о коде.

Это позволяет нам просматривать все типы данных как функции. На мой взгляд, это облегчает понимание функциональных языков программирования.

Хотите бросить себе вызов, чтобы узнать эти вещи и взглянуть на мир по-новому? Попробуйте представить общие конструкции с помощью лямбда-исчисления. Например, попробуйте определить false и вычислить (not false). Подумайте, как вы могли бы использовать функциональное программирование для добавления элементов в список.

Прежде всего, не забывайте получать удовольствие.

Спасибо за прочтение. Хорошего дня.