анонимные лямбда-функции (функциональное программирование)

10

Что такое анонимные (лямбда) функции? Каково формальное определение анонимной функции в функциональном языке программирования?

Проще говоря, когда я программирую на схеме / lisp, я бы сказал, что анонимная (лямбда) функция - это функция, которая не связана с идентификатором.

Это все, что вы можете сказать формально о лямбда-функции? Я думаю, что к этому простому определению можно добавить больше деталей. Пожалуйста, уточните, и спасибо!

CodeKingPlusPlus
источник

Ответы:

10

На мой взгляд, это все, что вы действительно можете сказать о них.

Идея состоит в том, что в языке высшего порядка функция - это просто еще один вид значения. Точно так же, как вы можете иметь (3 + 4) без идентификатора в C, вы можете иметь (лямбда (x) + (3 x))) без идентификатора в схеме.

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

jmite
источник
11

В лямбда-исчислении все функции (члены) являются анонимными. Это важное свойство лямбда-исчисления: вы можете составлять сложные функции из более простых, не называя их именами.

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

Если язык позволяет выражать анонимные функции (то есть функции без имен), это может дать преимущество как программистам, так и компиляторам: программисты могут часто писать более короткий код, а компиляторы могут лучше оптимизировать, зная, что анонимная функция используется только в заданной области. место и не где-нибудь еще.

Петр Пудлак
источник
1

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

Фактически, с точки зрения лямбда-исчисления, лямбда-выражения - это очень синтаксическая конструкция, используемая для создания привязок. Напомним обозначения, используемые в лямбда-исчислении:

λf.λx.fx

где и связаны внутри внутреннего выражения . Каждое лямбда-выражение там определяет привязку и, таким образом, действует как локальный контекст для привязок имен.х ф хfxfx

Язык обычно предлагает способы, такие как let(ML как языки, схема) или define(схема) для создания привязок, используемых на верхнем уровне (или внутри синтаксических конструкций, более сложных, чем функции, такие как модули или объекты), но единственный необходимый инструмент для привязки это лямбда на нижних уровнях.

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

Для конкатенативных языков история немного другая. Лямбды не нужны, а на самом деле контрпродуктивны. Какой смысл определять анонимные лямбды, когда все является функцией ?

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

Некоторые указатели на тему введены (плохо) в этом ответе:

didierc
источник