Лямбда - это средство создания анонимной функции или замыкания. В императивных языках (и функциональных) это эквивалентно разрешению вложенных функций, где внутренняя функция имеет доступ к локальной переменной и параметрам включающей функции. Он встречается в функциональных языках под ключевыми словами lambda
, fun
, fn
или даже \
; в Smalltalk это называется блок . Он также встречается в большинстве языков сценариев, например, Perl, Python, Lua и т. Д.
О единственных языках без лямбда *
Языки без вложенных функций, такие как Standard C или Icon
Языки с вложенными функциями второго класса - функция не может быть возвращена из функции, сохранена в глобальной переменной или сохранена в структуре данных, выделенной в куче. В эту языковую семью входят Паскаль и его потомки из семейства Модула, Ада и CLU.
Лямбда имеет важные последствия для программистов и разработчиков компиляторов: больше невозможно хранить все локальные переменные в стеке . Вместо этого некоторые переменные могут быть захвачены и сохранены в закрытом распределении кучи. Помните, что когда вы пишете лямбду, вы пишете распределение .
Пример: одна из простейших функций - композиция (синтаксис Haskell):
compose f g = \x -> f (g x)
Это говорит о том, что compose
принимает две функции f
и g
в качестве аргументов, и возвращает анонимную функцию, которая принимает свой аргумент x
, а затем применяет g
и затем f
к x
, Приложение compose
создает замыкание, выделенное в куче , в котором хранятся значения f
и g
, а также указатель на код для тела лямбды. На языках, где распространена лямбда, таких как Haskell, ML, Caml и Scheme, много усилий было потрачено , чтобы сделать выделение невероятно быстрым . Некоторые языки сценариев, такие как Lua, имеют необычные реализации, которые делают случай, не являющийся лямбда-выражением, таким же, как в императивном языке, и в то же время делают лямбда-вывод достаточно быстрым. Лямбда также работает быстро в Smalltalk, который также был предназначен для размещения большого количества объектов в куче . В языках, где лямбда была модифицирована, например, в Perl или Java (внутренние классы связаны с лямбдой), затраты могут быть значительно выше.
В общем, если язык был разработан с учетом лямбд, вы можете использовать их сколько угодно. Особенно в ML, Caml, Scheme, Haskell, даже анонимные функции очень дешевы --- используйте их много!