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


10

Що таке анонімні (лямбда) функції? Яке формальне визначення анонімної функції у функціональній мові програмування?

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

Це все, що можна формально сказати про функцію лямбда? Я думаю, є більше деталей, які можна додати до цього простого визначення. Будь ласка, докладно, і дякую!


Відповіді:


10

На мою думку, це все, що ви насправді можете сказати про них.

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

Ключовим тут є не те, що в анонімних функціях є щось особливе. Лише обмеження інших мов вимагають, щоб функції розглядалися інакше, ніж будь-яке інше значення. Спеціальні визначення призначені для процедурних мов, які їх не дозволяють, а не для функціональних мов.


11

У обчисленні лямбда всі функції (терміни) є анонімними. Це важлива властивість обчислення лямбда: ви можете складати складні функції з простих, не даючи їм імен.

У мовах програмування в більшості випадків бажано давати імена функціям, оскільки саме так ми думаємо, і це робить код читабельним для людей. Але компіляція врешті-решт видаляє імена під час створення виконуваного файлу (якщо ми нехтуємо інформацією про налагодження).

Якщо мова дозволяє виражати анонімні функції (тобто функції без імен), вона може дати перевагу як програмістам, так і компіляторам: програмісти часто можуть писати коротший код, а компілятори можуть краще оптимізувати, знаючи, що анонімна функція використовується саме в заданому режимі місце і ніде більше.


1

Це залежить від того, на якій частині вашого питання ви ставите акцент. Якщо конкретно властивість бути анонімним для анонімних функцій, то справді єдиною відповіддю є те, що вони є незв'язаними значеннями . Якщо ви говорите про функції в цілому, анонімні функції - це, мабуть, найпомітніший прояв використання обчислення лямбда у функціональній обстановці для мов застосунку .

Насправді, з точки зору обчислення лямбда, вирази лямбда - це сама синтаксична конструкція, яка використовується для створення прив’язок. Нагадаємо позначення, що використовуються в обчисленні лямбда:

λf.λх.fх

де і пов'язані всередині внутрішнього виразу . Кожен вираз лямбда визначає зв'язування і, таким чином, виступає локальним контекстом для прив’язки імен.fхfх

Мова зазвичай пропонує такі способи, як let(ML, як мови, схема) або define(схема), щоб створити прив’язки, які можна використовувати на верхньому рівні (або в синтаксичних конструкціях, складніших за функції, як модулі чи об'єкти), але єдиний необхідний інструмент для прив’язками є лямбда на нижчих рівнях.

Якщо ви подивитеся на такі мови, як діаграми схем чи лісп, то їх основою є числення лямбда, і багато спеціальних форм справді є лямбдами з цукровим покриттям.

Що стосується мов , що сполучаються , історія дещо відрізняється. Лямбди не потрібні, а насправді контрпродуктивні. Який сенс визначати анонімні лямбда, коли все є функцією ?

Між цими двома видами мангустів якось існує подвійність. Пізніший орієнтований на безточну комбінацію функцій і, таким чином, намагається представити все як функції, тоді як перший працює над більш детальним обчисленням і докладає зусиль, щоб функції були як першокласні значення, як і будь-які інші значення мови. У цьому відношенні можна було бачити лямбда в результаті цих зусиль.

Деякі вказівки на тему (неякісно), введені у цій відповіді:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.