Анонимна функция: Разлика между версии

Изтрито е съдържание Добавено е съдържание
м замяна с n-тире
Редакция без резюме
Ред 65:
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()));
}
}
Ред 133:
=== Карта (Map) ===
Тази функция използва всеки елемент от списък, извиквайки функция за него. Следният пример показва функция, която повдига на квадрат всеки елемент от даден списък.
>>> a = [1, 2, 3, 4, 5, 6]
 
>>> print map(lambda x: x*x, a)
 
[1, 4, 9, 16, 25, 36]
Ред 142:
=== Филтър ===
Филтърната функция връща всички елементи от списък, които са оценени като верни, когато преминават през определена функция.
>>> a = [1, 2, 3, 4, 5, 6]
 
>>> print filter(lambda x: x % 2 == 0, a)
 
[2, 4, 6]
Ред 328:
|-
| [[Rust (programming language)|Rust]]
| Да
|-
| [[Scala (programming language)|Scala]]
Ред 368:
 
=== C# ===
Поддръжката на анонимни функции в [[C#]] се е задълбочила през различните версии на компилатора на езика. C # езикът v3.0 В, излязъл през ноември 2007 г. с .NET Framework-а v3.5, има пълна поддръжка на анонимни функции. В C # те се наричат „[[Https://en.wikipedia.org/wiki/Lambda calculus|ламбда изрази]]“(„lambda expressions“), следвайки първоначалната версия на анонимни функции, ламбда смятане(lambda calculus). Вижте [http://www.microsoft.com/download/en/details.aspx?id=7029 C# 4.0 спецификацията секцията 5.3.3.29], за повече информация. <blockquote>Ламбда изразите представляват анонимни функции, които съдържат изрази или последователност от оператори. Всички ламбда изрази</blockquote><blockquote>използват ламбда оператора =>, който може да се чете като „отива в“. Идеята за ламбда изразите в C# е заимствана от функционалните езици</blockquote><blockquote>(например Haskell, Lisp, Scheme, F# и др.). Лявата страна на ламбда оператора определя входните параметри на анонимната функция, а дясната страна представлява израз или последователност от оператори, която работи с входните параметри и евентуално връща някакъв резултат.<ref>Светлин Наков, Веселин Колев и колектив, [http://www.introprogramming.info/wp-content/uploads/2015/10/Intro-CSharp-Book-v2015.pdf "Въведение в програмирането със C# „]. Велико Търново, Фабер, 2011. ISBN 978-954-400-527-6. – глава 22, стр.922 – 928 </ref></blockquote><syntaxhighlight lang=“c#">
// <see href="http://msdn.microsoft.com/en-us/library/bb549151.aspx" />
Func<int,int> foo = x => x*x;
Ред 377:
// will Not Compile!
var foo = (int x) => x*x;
</syntaxhighlight>Въпреки това, един ламбда израз може да вземе участие в [[type inference]] и може да се използва като [[Https://en.wikipedia.org/wiki/Parameter (computer science)|аргумент на метод]], например да използват анонимни функции с въжмойностите на Map(Карта) от System.Collections.Generic.List (в ConvertAll () метод): <syntaxhighlight lang="c#">
// Initialize the list:
var values = new List<int>() { 7, 13, 4, 9, 3 };
Ред 385:
</syntaxhighlight>
 
Предишните версии на C# са имали по-ограничена поддръжка на анонимните функции. C# v1.0, въвежда през февруари 2002 г. с .NET Framework v1.0, предоставянето на частична поддръжка на анонимните функции чрез използването на [[Https://en.wikipedia.org/wiki/Delegate (CLI)|делегати (delegates)]]. Тази конструкция е в известна степен подобНа на PHP делегатите. В C# 1.0, делегатите са като указатели на функции, които се отнасят до определен метод в рамките на един клас. (Но за разлика от PHP името не се изисква в момента на използване на делегата.)
C# v2.0, издаден през ноември 2005 г. с .NET Framework v2.0, въвежда концепцията за анонимни методи, като начин да пишат неименувани инлайн блокове изявление(inline statement blocks), които могат да бъдат изпълнени чрез
извикване на делегат(delegate invocation). C# 3.0 продължава да поддържа тези конструкции, но също така поддържа и експресивната ламбда конструкция.
Ред 399:
return d*d;
}
 
static void Main(string[] args)
{
// C# 1.0: Original delegate syntax required
// initialization with a named method.
SquareDelegate A = new SquareDelegate(Square);
System.Console.WriteLine(A(3));
 
// C# 2.0: A delegate can be initialized with
// inline code, called an "anonymous method." This
Ред 412:
SquareDelegate B = delegate(int d) { return d*d; };
System.Console.WriteLine(B(5));
 
// C# 3.0. A delegate can be initialized with
// a lambda expression. The lambda takes an int, and returns an int.
// The type of x is inferred by the compiler.
SquareDelegate C = x => x*x;
System.Console.WriteLine(C(7));
 
// C# 3.0. A delegate that accepts a single input and
// returns a single output can also be implicitly declared with the Func<> type.
System.Func<int,int> D = x => x*x;
System.Console.WriteLine(D(9));
}
}
</source>