Анонимна функция (или т.нар. функционален литерал или ламбда функция) в програмирането е дефинирана функция, която не е обвързана с идентификатор, тоест не е именувана.

Най-често анонимните функции могат да бъдат използвани:"Higher order functions". learnyouahaskell.com. Посетен на 3 декември 2014. като аргументи, които се прехвърлят към функции от по-висок ред, или за построяване на резултата на функция от по-висок ред, която трябва да върне функция.

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

Произходът на анонимните функции е свързан с работата на Алонсо Чърч и неговата теория за ламбда смятане, (създадена преди ерата на компютрите), в която всички функции са анонимни.Fernandez, Maribel (2009), Models of Computation: An Introduction to Computability Theory, Undergraduate Topics in Computer Science, Springer Science & Business Media, p. 33, ISBN 9781848824348, The Lambda calculus ... was introduced by Alonzo Church in the 1930s as a precise notation for a theory of anonymous functions В няколко програмни езика анонимните функции се представят чрез използването на ключовата дума ламбда, а анонимните функции често са посочени като ламбди или ламбда абстракции. Анонимните функции се въвеждат за пръв път в програмния език Lisp през 1958 г. Оттогава непрекъснато се увеличава броя на съвременните езици, които поддържат анонимни функции.

Анонимните функции са форма на вложена функция, в която е позволен достъпа до променливи в обхвата на съдържащата функция. Ето защо анонимните функции трябва да бъдат имплементирани чрез използването на затваряне. За разлика от именуваните вложени функции, те не могат да бъдат рекурсивни без помощта на т.нар. оператор на неподвижната точка (т.нар. анонимна неподвижна точка или анонимна рекурсия)."Lecture 29: Fixpoints and Recursions". CS3110 Spring 2012 :: Data Structures and Functional Programming. Cornell University – Computer Science. Посетен на 3 декември 2014.

Приложение Анонимните функции могат да се използват за съдържащи функционалност, които не се нуждаят от наименуване и имат възможност за използване за кратък период от време. Някои първични примери включват затваряне и обработване.

Употребата на анонимните функции е въпрос на стил. Използването им никога не е единственият начин за решаване на проблем: всяка анонимна функция може да бъде дефинирана като именувана функция и наричана по име. Някои програмисти използват анонимните функции за капсулиране на специфични еднократни кодове, за да не се усложнява основния код с много едноредови нормални функции.

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

Целият код в следващата секция е написан на Python 2.x (not 3.x).

В Java анонимните функции започват с JDK 8www.oracle.com и са познати като ламбда изрази.

Ламбда изразите се състоят от разделен със запетая списък на формалните параметри затворен в скоби, стрела знак (->), и тяло. Типът на данни на параметрите винаги може да бъде пропуснат, както и скобите, ако има само един параметър. Тялото може да се състои от едно твърдение или блок от твърдения. // with no parameter () -> System.out.println("Hello, world.")

// with a single parameter (This example is an identity function). a -> a

// with a single expression (a, b) -> a + b

// with explicit type information (long id, String name) -> "id: " + id + ", name:" + name

// with a code block (a, b) ->{ return a + b; }

// with multiple statements in the lambda body. It requires a code block. // This example also includes two nested lambda expressions (the first one is also a closure). (id, defaultPrice) ->{ Optional<Product> product = productList.stream().filter(p -> p.getId() == id).findFirst(); return product.map(p -> p.getPrice()).orElse(defaultPrice); }Ламбда изразите се превръщат във „функционални интерфейси“ (дефинират се като интерфейси, които съдържат само един абстрактен метод в допълнение към един или повече по подразбиране или статични методиThe Java Tutorials: Lambda Expressions, docs.oracle.com), както е показано в следните примери:public class Calculator { interface IntegerMath { int operation(int a, int b);

default IntegerMath swap() { return (a, b) -> operation(b, a);

private static int apply(int a, int b, IntegerMath op) { return op.operation(a, b);

public static void main(String... args) { IntegerMath addition = (a, b) -> a + b; IntegerMath subtraction = (a, b) -> a – b; System.out.println("40 + 2 = " + apply(40, 2, addition)); System.out.println("20 – 10 = " + apply(20, 10, subtraction)); System.out.println("10 – 20 = " + apply(20, 10, subtraction.swap()));

}В този пример е деклариран функционалният интерфейс наречен IntegerMath. Ламбда изразите, които имплементират IntegerMath се предават на метода apply(), за да бъде изпълнен. Методи по подразбиране като swap дефинират методи за функции.

Сортиране При сортиране по нестандартен начин може да бъде по-лесно да се използва логическо сравнение в анонимна функция вместо да се създава именувана функция. Повечето езици позволяват създаването на сортираща функция, която имплементира алгоритъм за сортиране за различни обекти. Тази функция обикновено приема името произволна функция за сравнение, това е взимане на 2 обекта и функцията показва дали те са равни или единият е „по-голям“ или „по-малък“от другия (обикновено се връща отговор като отрицателно, нула, или положително число).

Сортиране на списък от низове по дължина на низа:>>> a = ['house', 'car', 'bike'] >>> a.sort(lambda x,y: cmp(len(x), len(y))) >>> print(a) ['car', 'bike', 'house']Анонимната функция в примера е ламбда израз:lambda x,y: cmp(...)Анонимната функция приема два аргумента, х и у, и връща сравнението между тях използвайки вградена функция cmp(). Друг пример може да бъде сортиране на обекти в списък по името на техния клас (в Python всички имат клас):>>> a = [10, 'number', 11.2] >>> a.sort(lambda x,y: cmp(x.__class__.__name__, y.__class__.__name__)) >>> print(a) [11.2, 10, 'number']Забележете че във версия 11.2 има клас „float“, а във версия 10 има клас „int“, и ‚число‘ има клас „str“. Сортиращият параметър е „float“, „int“, тогава „str“.

Затваряне (информатика)

Затварянето в програмирането е такава функция, която запазва обектите дефинирани в нейната среда на видимост, поне докато те се използват или са реферирани. Затварянията обикновено се ползват в езици, в които функциите са обекти от първи клас, с други думи езици, които позволяват функции да бъдат аргументи, да бъдат връщани като резултат от други функции от по-висок ред, да бъдат запазвани като променливи, подобно на примитивни типове (напр. int или string).

В следващия пример чрез анонимна функция се сравнява стойността на входящата променлива х с дадена променлива "threshold":def comp(threshold): return lambda x: x < thresholdТози пример може да се използва като генератор на сравнителни функции:>>> func_a = comp(10) >>> func_b = comp(20)

>>> print func_a(5), func_a(8), func_a(13), func_a(21) True True False False

>>> print func_b(5), func_b(8), func_b(13), func_b(21) True True True FalseБи било непрактично да се създава нова функция за всяко възможно сравнение. Понякога е неудобно да се запазва стойността на прага като променлива за по-нататъшна употреба. Без значение каква е причината да се използва затваряне, анонимната функция е тази, която съдържа функционалността да се прави сравнение.

Къринг (Currying) Къринг е техника на промяна на логиката на изчисление от една функция, която приема множество от аргументи (или кортеж) към серия от функции, които приемат по точно един аргумент. В този случай за пример е дадена трансформация на функция за деление с произволно цяло число към функция за деление с точно определено цяло число.>>> def divide(x, y): ... return x / y

>>> def divisor(d): ... return lambda x: divide(x, d)

>>> half = divisor(2) >>> third = divisor(3)

>>> print half(32), third(32) 16 10

>>> print half(40), third(40) 20 13

Въпреки че анонимни функции рядко се използват при къринг, те все пак имат своето място. В горния пример функцията „devisor“ генерира функции с променлив делител. Анонимните функции „half“ и „third“ кърират функцията „divide“ с фиксиран делител (2 и 3).

Функцията „devisor“ също така е затваряне, понеже запазва определена стойност на променливата „d“.

Функции от по-висок порядък Python 2.x включва няколко функции, които използват анонимните функции като аргумент. Тази секция описва някои от тях.

Карта (Map) Тази функция използва всеки елемент от списък, извиквайки функция за него. Следният пример показва функция, която повдига на квадрат всеки елемент от даден списък. >>> a = [1, 2, 3, 4, 5, 6]

>>> print map(lambda x: x*x, a)

[1, 4, 9, 16, 25, 36] Анонимната функция (отгоре) приема аргумент и го умножава по себе си (повдига го на квадрат).

Филтър Филтърната функция връща всички елементи от списък, които са оценени като верни, когато преминават през определена функция. >>> a = [1, 2, 3, 4, 5, 6]

>>> print filter(lambda x: x % 2 == 0, a)

[2, 4, 6] Тази функция проверява дали подаденият аргумент е с четна стойност.

Фолд (fold, обвиваща) функция Фолд функцията минава през всички елементи от списъка (обикновено от ляво надясно), натрупвайки стойност от това преминаване. Най-често се използва, за да комбинира всички елементи от списък в единична стойност, като например: >>>> а = [1, 2, 3, 4, 5]

>>>> print reduce(lambda x,y: x*y, a)

120 Този код пресмята следното:

(((1 Х 2) Х 3) Х 4) Х 5) = 120

В този случай финцията изпълнява умножение на 2 аргумента.

Резултатът от тази функция не е задължително да е единична стойност – всъщност и функцията map и функцията filter могат да бъдат създадени чрез функцията fold. При функцията map, стойността, която е акумулирана е нов списък, съдържащ резултатите от използването на функцията на всеки елемент от оригиналния списък. При filter функцията, стойността, която се акумулира е нов списък, който съдържа само елементите, които отговарят на определено условие.

Списък с езици Списъкът отдолу съдържа програмни езици, които поддържат напълно безименните анонимни функции, съпортват някои варианти на анонимни функции и такива, които не поддържат анонимни функции.

Тази таблица показва някои основни тенденции. Първо, езиците, които не поддържат анонимни функции са следните: C, Pascal, Object Pascal, Java – всичките те са статично ориентирани езици. Това обаче не означава, че статичните езици са неспособни да поддържат анонимни функции. Например, ML езиците са от статичен тип и в основата си съдържат анонимни функции, също така и Delphi, който е „диалект“ на обектно ориентирания Pascal, е бил разширен, за да поддържа тези функции. Второ, езиците, които „третират“ анонимните фунции като фунции от първи клас – Dylan, JavaScript, Lisp, Scheme, ML, Haskell, Python, Ruby, Perl, в общи линии поддържат анонимни функции, така че тези функции могат да бъдат дефинирани и използвани лесно при други видове данни. Новият C++ стандарт добавя тези функции към C++, въпреки че той е общоприет статичен език.