Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

«Пусть» выражение может быть также определено в математике, где он ассоциирует логическое условие с ограниченной области.

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

Выражение let присутствует во многих функциональных языках, чтобы разрешить локальное определение выражения для использования при определении другого выражения. Let-выражение присутствует в некоторых функциональных языках в двух формах; пусть или "пусть рек". Пусть rec является расширением простого выражения let, которое использует комбинатор с фиксированной точкой для реализации рекурсии .

История [ править ]

Дана Скотт «s язык LCF [1] был этап в эволюции лямбда - исчисления в современных функциональных языках. В этом языке появилось выражение let, которое с того времени появилось в большинстве функциональных языков.

Языки Scheme , [2] ML и, совсем недавно, Haskell [3] унаследовали выражения let от LCF.

Императивные языки с отслеживанием состояния, такие как ALGOL и Pascal, по сути, реализуют выражение let для реализации ограниченного объема функций в блочных структурах. [ необходима цитата ]

Тесно связанное предложение where вместе с его рекурсивным вариантом where rec появилось уже в книге Питера Ландина « Механическое вычисление выражений» . [4]

Описание [ править ]

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

В обоих случаях вся конструкция представляет собой выражение, значение которого равно 5. Как и if-then-else, тип, возвращаемый выражением, не обязательно является логическим.

Выражение let бывает четырех основных форм:

В функциональных языках выражение let определяет функции, которые могут быть вызваны в выражении. Объем имени функции ограничен структурой выражения let.

В математике выражение let определяет условие, которое является ограничением для выражения. Синтаксис также может поддерживать объявление количественно определяемых переменных, локальных по отношению к выражению let.

Терминология, синтаксис и семантика меняются от языка к языку. В схеме , пусть используются для формы простой и пусть прн для рекурсивной формы. В ML let помечает только начало блока объявлений с fun, обозначающим начало определения функции. В Haskell let может быть взаимно рекурсивной, когда компилятор выясняет, что необходимо.

Определение [ править ]

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

эквивалентно определение функции пути в выражении , которое может быть записано в виде пусть выражения;

Выражение let понятно как выражение естественного языка. Выражение let представляет собой замену значения переменной. Правило подстановки описывает последствия равенства как подстановки.

Пусть определение в математике [ править ]

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

где E и F имеют тип Boolean.

Пусть выражение позволяет замене быть применена к другому выражению. Эта подстановка может применяться в ограниченном объеме к подвыражению. Естественное использование выражения let - приложение к ограниченной области (так называемое лямбда-отбрасывание ). Эти правила определяют, как можно ограничить объем;

где F не относится к типу Boolean . Из этого определения может быть получено следующее стандартное определение выражения let, которое используется в функциональном языке.

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

Вывод [ править ]

Чтобы получить этот результат, сначала предположим,

тогда

Используя правило подстановки,

так что для всех L ,

Пусть где K - новая переменная. тогда,

Так,

Но из математической интерпретации бета-редукции

Здесь, если y является функцией переменной x, это не то же самое x, что и в z. Может применяться альфа-переименование. Итак, мы должны иметь

так,

Этот результат представлен на функциональном языке в сокращенной форме, где значение однозначно;

Здесь переменная x неявно распознается как часть уравнения, определяющего x, и как переменная в квантификаторе существования.

Нет лифтинга из логического [ править ]

Противоречие возникает, если E определяется как . В таком случае,

становится,

и используя,

Это неверно, если G ложно. Чтобы избежать этого противоречия, F не может быть логического типа. Для логического F правильный оператор правила отбрасывания использует импликацию вместо равенства,

Может показаться странным, что для Boolean применяется другое правило, чем для других типов. Причина в том, что правило

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

Присоединение к let выражениям [ править ]

Пусть выражения могут быть определены с несколькими переменными,

тогда это может быть получено,

так,

Законы, касающиеся лямбда-исчисления и let-выражений [ править ]

Сокращение Eta дает правила для описания лямбда - абстракции. Это правило вместе с двумя законами, выведенными выше, определяют связь между лямбда-исчислением и let-выражениями.

Пусть определение определено из лямбда-исчисления [ править ]

Чтобы избежать потенциальных проблем, связанных с математическим определением , Дана Скотт первоначально определила выражение let из лямбда-исчисления. Это можно рассматривать как восходящее или конструктивное определение выражения let , в отличие от нисходящего или аксиоматического математического определения.

Простое нерекурсивное выражение let было определено как синтаксический сахар для лямбда-абстракции, применяемой к термину. В этом определении

Затем определение простого выражения let было расширено, чтобы разрешить рекурсию с использованием комбинатора с фиксированной точкой .

Комбинатор с фиксированной точкой [ править ]

С фиксированной точкой комбинатор может быть представлена выражением,

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

Используя правило сокращения эта,

дает,

Выражение let может быть выражено как лямбда-абстракция, используя,

дает,

Возможно, это простейшая реализация комбинатора с фиксированной точкой в ​​лямбда-исчислении. Однако одно бета-сокращение дает более симметричную форму Y-комбинатора Карри.

Рекурсивное выражение let [ править ]

Рекурсивное выражение let, называемое "let rec", определяется с помощью комбинатора Y для рекурсивных выражений let.

Взаимно рекурсивное выражение let [ править ]

Затем этот подход обобщается для поддержки взаимной рекурсии. Взаимно рекурсивное выражение let может быть составлено путем изменения порядка выражения для удаления любых условий и. Это достигается заменой нескольких определений функций одним определением функции, которое устанавливает список переменных, равный списку выражений. Версия комбинатора Y, называемая поливариадическим комбинатором фиксированной точки Y * [5] , затем используется для вычисления фиксированной точки всех функций одновременно. Результатом является взаимно рекурсивная реализация выражения let .

Несколько значений [ править ]

Выражение let может использоваться для представления значения, которое является членом набора,

При применении функции от одного выражения let к другому,

Но для применения выражения let к самому себе применяется другое правило.

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

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

Недостаточно, чтобы форма представляла только набор значений. Каждое значение должно иметь условие, определяющее, когда выражение принимает значение. Результирующая конструкция представляет собой набор пар условий и значений, называемый «набором значений». См. Сужение наборов алгебраических значений .

Правила преобразования между лямбда-исчислением и выражениями let [ править ]

Будут даны мета-функции , которые описывают преобразование между лямбда- выражениями и let . Мета-функция - это функция, которая принимает программу в качестве параметра. Программа - это данные для метапрограммы. Программа и метапрограмма находятся на разных мета-уровнях.

Следующие соглашения будут использоваться, чтобы отличить программу от метапрограммы,

  • Квадратные скобки [] будут использоваться для обозначения применения функции в метапрограмме.
  • Заглавные буквы будут использоваться для переменных в метапрограмме. Строчные буквы обозначают переменные в программе.
  • будет использоваться для равных в метапрограмме.

Для простоты будет применяться первое правило с учетом того, что совпадения. Правила также предполагают, что лямбда-выражения были предварительно обработаны, поэтому каждая лямбда-абстракция имеет уникальное имя.

Также используется оператор подстановки. Выражение означает замену каждого вхождения G в L на S и возврат выражения. Используемое определение расширено, чтобы охватить замену выражений из определения, данного на странице лямбда-исчисления . Сопоставление выражений должно сравнивать выражения на альфа-эквивалентность (переименование переменных).

Преобразование из лямбда в выражения let [ править ]

Следующие правила описывают, как преобразовать лямбда-выражение в выражение let без изменения структуры.

Правило 6 создает уникальную переменную V в качестве имени функции.

Пример [ править ]

Например, комбинатор Y ,

конвертируется в,

Преобразование let в лямбда-выражения [ править ]

Эти правила обращают обратное преобразование, описанное выше. Они преобразуют выражение let в лямбда-выражение без изменения структуры. Не все выражения let могут быть преобразованы с использованием этих правил. Правила предполагают, что выражения уже расположены так, как если бы они были сгенерированы de-lambda .

В лямбда-исчислении нет точного структурного эквивалента для выражений let со свободными переменными, которые используются рекурсивно. В этом случае требуется некоторое дополнение параметров. Правила 8 и 10 добавляют эти параметры.

Правил 8 и 10 достаточно для двух взаимно рекурсивных уравнений в выражении let . Однако они не будут работать для трех или более взаимно рекурсивных уравнений. В общем случае требуется дополнительный уровень зацикливания, что немного усложняет метафункцию. Следующие правила заменяют правила 8 и 10 при реализации общего случая. Правила 8 и 10 оставлены, чтобы вначале можно было изучить более простой случай.

  1. лямбда-форма - преобразование выражения в конъюнктуру выражений, каждое из которых имеет форму переменная = выражение .
    1. ...... где V - переменная.
  2. lift-vars - получает набор переменных, которым требуется X в качестве параметра, потому что в выражении X является свободной переменной.
  3. sub-vars - для каждой переменной в наборе замените ее на переменную, примененную к X в выражении. Это делает X переменной, передаваемой в качестве параметра, вместо того, чтобы быть свободной переменной в правой части уравнения.
  4. de-let - Поднять каждое условие в E, чтобы X не была свободной переменной в правой части уравнения.

Примеры [ править ]

Например, выражение let, полученное из комбинатора Y ,

конвертируется в,

В качестве второго примера возьмем расширенную версию комбинатора Y ,

конвертируется в,

В качестве третьего примера перевод слова

является,

Ключевые люди [ править ]

  • Дана Скотт

См. Также [ править ]

  • Область применения (информатика)
  • Лямбда-лифтинг
  • Комбинатор с фиксированной точкой
  • Лямбда-исчисление
  • Парадокс карри
  • Дедуктивное лямбда-исчисление
  • Программирование логики ограничений
  • Сужение алгебраических множеств значений

Ссылки [ править ]

  1. ^ «PCF - это язык программирования для вычислимых функций, основанный на LCF, логике вычислимых функций Скотта» ( Плоткин 1977 ). Программирование вычислимых функций используется ( Mitchell 1996 ). Это также называется программированием с помощью вычислимых функций или языком программирования для вычислимых функций .
  2. ^ «Схема - Переменные и Let-выражения» .
  3. ^ Саймон, Марлоу (2010). «Отчет о языке Haskell 2010 - Let Expressions» .
  4. ^ Ландин, Питер Дж. (1964). «Механическая оценка выражений» . Компьютерный журнал . Британское компьютерное общество . 6 (4): 308–320. DOI : 10.1093 / comjnl / 6.4.308 .
  5. ^ "Простейшие поливариадические комбинаторы неподвижных точек для взаимной рекурсии" .