Funzione anonima

In programmazione informatica, una funzione anonima o funzione lambda è una funzione definita, e possibilmente chiamata, senza essere legata a un identificatore. Le funzioni anonime sono utili per passare come argomento una funzione di ordine superiore e si trovano in linguaggi che supportano funzioni di prima classe, come ad esempio Haskell.

Le funzioni anonime sono una forma di funzione nidificata, che consente l'accesso alle variabili nella portata della funzione contenitrice (variabili non locali). Benché siano nominate come funzioni annidate, non possono essere ricorsive senza l'aiuto di un operatore fixed-point combinator (funzione di ordine superiore) che in questo caso viene chiamato fixpoint anonimo o ricorsione anonima.

Queste funzioni anonime nascono dal lavoro di Alonzo Church sul Lambda calcolo del 1936. In molti linguaggi di programmazione le funzioni anonime sono introdotte con la parola chiave lambda ed è per questo che ci si riferisce a esse come funzioni lambda.

Già nel 1958, Lisp aveva funzioni anonime. Oggi si trovano in molti altri linguaggi, come Scala, JavaScript, Ruby, Python, PHP, C++, Perl, Visual Basic, Delphi, Java, ecc., sebbene alcuni di questi non siano nati come veri e propri linguaggi funzionali.

Supporto nei vari linguaggi

Python

Python supporta funzioni anonime semplici attraverso la forma lambda. Il corpo d'esecuzione della lambda deve essere una espressione e non una dichiarazione, e quindi questa è una restrizione alla sua utilità. Il valore restituito dalla lambda è il valore contenuto nell'espressione.

foo = lambda x: x*x
print(foo(10)) # stampa 100

VB.NET

In Visual Basic.NET è possibile creare funzioni anonime o lambda usando le parole chiave Sub o Function nello stesso modo in cui si crea una normale subroutine o una funzione. Le espressioni lambda sono racchiuse in una istruzione (che però può avere più righe). È possibile creare espressioni lambda che utilizzano elaborazione asincrona usando gli operatori Async e Await.

Dim somma = Function(x)
               Return x + 2
            End Function

Ruby

Ruby supporta le funzioni anonime usando una struttura sintattica chiamata block. Quando è passata a un metodo, un blocco è convertito in un oggetto di classe Proc in alcune circostanze.

# Example 1:
# Purely anonymous functions using blocks.
ex = [16.2, 24.1, 48.3, 32.4, 8.5]
ex.sort_by { |x| x - x.to_i } # sort by fractional part, ignoring integer part.
# [24.1, 16.2, 48.3, 32.4, 8.5]

# Example 2:
# First-class functions as an explicit object of Proc -
ex = Proc.new { puts "Hello, world!" }
ex.call # Hello, world!

# Example 3:
# Function that returns lambda function object with parameters
def is_multiple_of(n)
    lambda{|x| x % n == 0}
end
multiple_four = is_multiple_of(4)
multiple_four.call(16)
#true
multiple_four[15]
#false

JavaScript

Le funzioni anonime, in JavaScript, si definiscono come le funzioni non anonime. Per esempio, la funzione

function add(a, b) { return a + b; }

in forma anonima si scrive

function(a, b) { return a + b; }

e può essere assegnata a una variabile

var a = function(a, b) { return a + b; }

oppure passata come parametro a un'altra funzione.

Dalla versione ES6 si può usare una sintassi alternativa più snella:

(a, b) => { return a + b; }

oppure, in modo ancora più sintetico

(a, b) => a + b

JavaScript supporta le funzioni anonime autoinvocanti, cioè che vengono invocate al momento stesso della dichiarazione. Questa modalità è ampiamente sfruttata in librerie runtime quali JQuery.

// Definizione ed esecuzione immediata
(function(a, b) {
    alert(a + b);
})(10, 11);

Oppure, da ES6 in poi:

alert( ((a, b) => a + b)(10, 11) );

TypeScript

const add = (x, y) => { return x + y };
alert(add(1,2));

Specificando i tipi (che in TypeScript sono opzionali):

const add = (x:number, y:number):number => { return x + y };
alert(add(1,2));

C#

Func<int, int, int> add = (x, y) => { return x + y; };
Console.WriteLine("{0}", add(1, 2));

C++

C++ aggiunge il supporto alle funzioni anonime a partire dalla versione 11 dello standard. [1]

// Esempio 1 - Funzione che somma due interi 

auto add = [](int x, int y) -> int { return x + y }; // [lista_di_cattura](parametri)->tipo_restituito {corpo_della_funzione}
std::cout << add(1, 2); // Per usare std::cout è necessario includere <iostream>

Nell'esempio precedente la variabile add è di tipo std::function<int(int, int)>, ovvero: std::function<tipo_restutuito(tipi_dei_parametri)>[2]. Tuttavia da C++11 in poi è possibile omettere il tipo formale (per l'appunto std::function<int(int, int)>) utilizzando la parola chiave auto se il tipo è deducibile al momento della compilazione (come in questo caso).[3]

Cattura delle variabili

In altri linguaggi (come JavaScript, per esempio) le funzioni lambda possono catturare tutte le variabili nel loro ambito di visibilità, più semplicemente, si può dire che una lambda ha accesso a tutte le variabili dichiarate prima della lambda stessa. In C++ è possibile specificare a quali variabili ha accesso la funzione lambda. Si può anche specificare se le variabili siano accessibili per valore o per riferimento (by value o by reference); le variabili passate per valore sono utilizzabili in modalità di sola lettura (read only).[2]

/* Esempio 2 - Funzione che cattura variabili per valore e 
 * tenta di modificarle producendo un errore di compilazione 
 */

#include <iostream>

int main(int argc, char** argv) {

    // 'a' e 'b' vengono inizializzati a 0
    int a = 0;
    int b = 0;

    // 'a' e 'b' vengono stampati
    std:: cout << "Prima della modifica\n"; 
    std::cout << "a=" << a << std::endl;
    std::cout << "b=" << b << std::endl;

    // Viene creata una lambda che cattura tutte
    // le variabili PER VALORE e tenta di modificarle
    // [=] cattura tutte le variabili per valore (sola lettura)
    auto f = [=]()->void {
        a = 1; //error: assignment of read-only variable ‘a’
        b = 2; //error: assignment of read-only variable ‘b’ 
    }

    // 'f' viene richiamata
    f();

    // 'a' e 'b' vengono stampati dopo la modifica
    std:: cout << "Dopo la modifica\n";
    std::cout << "a=" << a << std::endl;
    std::cout << "b=" << b << std::endl;
    
    return 0;
}

L'output del compilatore è il seguente:

~$ g++ -std=c++11 esempio2.cpp -o esempio2
esempio2.cpp: In lambda function:
esempio2.cpp:22:11: error: assignment of read-only variable ‘a’
        a = 1;
          ^
esempio2.cpp:23:11: error: assignment of read-only variable ‘b’
        b = 2;
          ^

Per correggere l'errore:

// Esempio 3 - Funzione che cattura due variabili per riferimento e le modifica 

#include <iostream>

int main(int argc, char** argv) {

    // 'a' e 'b' vengono inizializzati a 0
    int a = 0;
    int b = 0;

    // 'a' e 'b' vengono stampati
    std:: cout << "Prima della modifica\n"; 
    std::cout << "a=" << a << std::endl;
    std::cout << "b=" << b << std::endl;

    // Viene creata una lambda che cattura tutte
    // le variabili PER RIFERIMENTO e le modifica
    // [&] cattura tutte le variabili per riferimento
    auto f = [&]()->void { 
        a = 1;
        b = 2;
    }

    // 'f' viene richiamata
    f();

    // 'a' e 'b' vengono stampati dopo la modifica
    std:: cout << "Dopo la modifica\n";
    std::cout << "a=" << a << std::endl;
    std::cout << "b=" << b << std::endl;
    
    return 0;
}

L'output del programma è il seguente: Prima della modifica a=0 b=0 Dopo la modifica a=1 b=2 Si può catturare le variabili con le seguenti modalità:

// Cattura tutto per valore (sola lettura)
[=] (parametri...)->tipo_restituito { /* ... */ } 

// Cattura tutto per riferimento 
[&] (parametri...)->tipo_restituito { /* ... */ } 

// Cattura 'x', 'y', 'z' per riferimento e nient'altro
[&x, &y, &z] (parametri...)->tipo_restituito { /* ... */ } 
// Cattura 'x', 'y', 'z' per riferimento e tutto il resto per valore
[=, &x, &y, &z] (parametri...)->tipo_restituito { /* ... */ } 

// Cattura 'a', 'b', 'c' per valore e nient'altro
[a, b, c] (parametri...)->tipo_restituito { /* ... */ }  
// Cattura 'a', 'b', 'c' per valore e tutto il resto per riferimento
[&, a, b, c] (parametri...)->tipo_restituito { /* ... */ }

Funzioni anonime autoinvocanti

C++ (come altri linguaggi, per esempio JavaScript) permette di dichiarare funzioni anonime autoinvocanti, cioè che vengono invocate al momento della dichiarazione:

// Esempio 4 - Funzione anonima autoinvocante che somma due interi 

([] (int a, int b) -> void {
        std::cout << a + b; // Stampa la somma tra 'a' e 'b'
})(1, 2); // Viene invocata la funzione passando come parametri 1 e 2; stamperà 3

Java

In Java le funzioni anonime sono state inserite nella versione 8 (rilasciata nel 2014) e sono specificabili secondo la seguente sintassi:[4]

(parametro1, parametro2) -> { blocco di codice }

Per esempio, il seguente codice:

List<T> newList = myList
		.stream()
		.filter(t -> verificaCondizione(t))
		.collect(Collectors.toList());

è l'equivalente funzionale di:

List<T> newList = new ArrayList<>();
for (T t : myList ) {
	if (verificaCondizione(t)) {
		newList.add(t);
	}
}

Note

  1. ^ Lambda functions (dal C++11), su it.cppreference.com.
  2. ^ a b (IT) Bjarne Stroustrup, C++ Linguaggio, libreria standard, principi di programmazione (C++ Programming language), capitolo 11.4, Pearson Italia, 2015, ISBN 9788865184486.
  3. ^ (IT) Bjarne Stroustrup, capitolo 6, in C++ Linguaggio, libreria standard, principi di programmazione (C++ Programming language), Quarta edizione, Pearson Italia, 2015, ISBN 9788865184486.
  4. ^ (EN) Java Lambda Expressions, su w3schools.com, W3Schools. URL consultato il 30 aprile 2021.

Voci correlate

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica

Read other articles:

Artikel ini adalah bagian dari seriPolitik dan ketatanegaraanIndonesia Pemerintahan pusat Hukum Pancasila(ideologi nasional) Undang-Undang Dasar Negara Republik Indonesia Tahun 1945 Hukum Perpajakan Ketetapan MPR Undang-undang Perppu Peraturan pemerintah Peraturan presiden Peraturan daerah Provinsi Kabupaten/kota Legislatif Majelis Permusyawaratan Rakyat Ketua: Bambang Soesatyo (Golkar) Dewan Perwakilan Rakyat Ketua: Puan Maharani (PDI-P) Dewan Perwakilan Daerah Ketua: La Nyalla Mattalitti (J...

 

 

Artikel ini tidak memiliki referensi atau sumber tepercaya sehingga isinya tidak bisa dipastikan. Tolong bantu perbaiki artikel ini dengan menambahkan referensi yang layak. Tulisan tanpa sumber dapat dipertanyakan dan dihapus sewaktu-waktu.Cari sumber: Kayu Jati, Panyabungan, Mandailing Natal – berita · surat kabar · buku · cendekiawan · JSTOR Kayu JatiKelurahanNegara IndonesiaProvinsiSumatera UtaraKabupatenMandailing NatalKecamatanPanyabunganKode...

 

 

Hanji. Hanji atau Kertas Korea (한지;韓紙) adalah kertas tradisional Korea yang telah digunakan sejak 1600 tahun yang lalu.[1][2] Orang Korea menggunakan hanji dalam berbagai perlengkapan sehari-hari dan keperluan rumah tangga mulai dari buku, dinding, jendela, lantai, sampai peti mati.[1] Dikatakan orang Korea memanfaatkan Hanji dari sejak lahir sampai mati.[1] Asal mula Kertas ditemukan oleh seorang kasim pada tahun 105 M (Dinasti Han) bernama Tsai Lun.&#...

Iranian historian (born 1976) Khodadad RezakhaniBorn1976Tehran, IranEducation PhD in Late Antique History of the Sassanid Empire from UCLA MSc Global History from the London School of Economics (LSE) Indo-European Studies and Iranian Languages at UC Berkeley, UCLA and SOAS Known forHistory of Central Asia Khodadad Rezakhani (Persian: خداداد رضاخانی, Persian pronunciation: [xo̯dʌdʌd rɛzʌxʌni] born 1976) is an Iranian historian of late antique Central and West As...

 

 

Sporting event delegationBahamas at the2008 Summer OlympicsFlag of the BahamasIOC codeBAHNOCBahamas Olympic CommitteeWebsitewww.bahamasolympiccommittee.orgin BeijingCompetitors25 in 4 sportsFlag bearer Debbie Ferguson-McKenzieMedalsRanked 64th Gold 0 Silver 1 Bronze 1 Total 2 Summer Olympics appearances (overview)1952195619601964196819721976198019841988199219962000200420082012201620202024 The Bahamas sent a delegation of athletes to compete in the 2008 Summer Olympics, which were held i...

 

 

ХристианствоБиблия Ветхий Завет Новый Завет Евангелие Десять заповедей Нагорная проповедь Апокрифы Бог, Троица Бог Отец Иисус Христос Святой Дух История христианства Апостолы Хронология христианства Раннее христианство Гностическое христианство Вселенские соборы Н...

الأوضاع القانونية لزواج المثليين زواج المثليين يتم الاعتراف به وعقده هولندا1 بلجيكا إسبانبا كندا جنوب أفريقيا النرويج السويد المكسيك البرتغال آيسلندا الأرجنتين الدنمارك البرازيل فرنسا الأوروغواي نيوزيلندا3 المملكة المتحدة4 لوكسمبورغ الولايات المتحدة5 جمهورية أيرلندا ...

 

 

莎拉·阿什頓-西里洛2023年8月,阿什頓-西里洛穿著軍服出生 (1977-07-09) 1977年7月9日(46歲) 美國佛羅里達州国籍 美國别名莎拉·阿什頓(Sarah Ashton)莎拉·西里洛(Sarah Cirillo)金髮女郎(Blonde)职业記者、活動家、政治活動家和候選人、軍醫活跃时期2020年—雇主內華達州共和黨候選人(2020年)《Political.tips》(2020年—)《LGBTQ國度》(2022年3月—2022年10月)烏克蘭媒�...

 

 

此条目序言章节没有充分总结全文内容要点。 (2019年3月21日)请考虑扩充序言,清晰概述条目所有重點。请在条目的讨论页讨论此问题。 哈萨克斯坦總統哈薩克總統旗現任Қасым-Жомарт Кемелұлы Тоқаев卡瑟姆若马尔特·托卡耶夫自2019年3月20日在任任期7年首任努尔苏丹·纳扎尔巴耶夫设立1990年4月24日(哈薩克蘇維埃社會主義共和國總統) 哈萨克斯坦 哈萨克斯坦政府...

Period after the end of the Cold War For the main trends, see International relations since 1989.Top: the change in borders in eastern Europe following the dissolution of the Soviet Union. Bottom: former Russian president Boris Yeltsin waving the Russian flag in celebration of Russian democracy on 22 August 1991 The post–Cold War era is a period of history that follows the end of the Cold War, which represents history after the dissolution of the Soviet Union in December 1991. This period s...

 

 

Soviet opera singer You can help expand this article with text translated from the corresponding article in Russian. (January 2021) Click [show] for important translation instructions. Machine translation, like DeepL or Google Translate, is a useful starting point for translations, but translators must revise errors as necessary and confirm that the translation is accurate, rather than simply copy-pasting machine-translated text into the English Wikipedia. Do not translate text that appe...

 

 

African diaspora Template‑classThis template is within the scope of WikiProject African diaspora, a collaborative effort to improve the coverage of African diaspora on Wikipedia. If you would like to participate, please visit the project page, where you can join the discussion and see a list of open tasks.African diasporaWikipedia:WikiProject African diasporaTemplate:WikiProject African diasporaAfrican diaspora articlesTemplateThis template does not require a rating on Wikipedia's content a...

For related races, see 2010 United States gubernatorial elections. 2010 Tennessee gubernatorial election ← 2006 November 2, 2010 2014 → Turnout41.32% [1] 8.65 pp   Nominee Bill Haslam Mike McWherter Party Republican Democratic Popular vote 1,041,545 529,851 Percentage 65.03% 33.08% County resultsCongressional district resultsHaslam:      50–60%      60–70%      70–80% ...

 

 

American Revolutionary War battle Battle of PrincetonPart of the New York and New Jersey campaignWashington Rallying the Americans at the Battle of Princeton by William Ranney (1848)DateJanuary 3, 1777; 247 years ago (1777-01-03)LocationPrinceton, New Jersey40°19′48″N 74°40′30″W / 40.33000°N 74.67500°W / 40.33000; -74.67500Result American victory[1]Belligerents United States  Great BritainCommanders and leaders George Washingt...

 

 

American journalist Hal CallBornHarold Leland CallSeptember 1917Grundy County, Missouri, USDiedDecember 18, 2000 (aged 83)San Francisco, California, USAlma materUniversity of MissouriOccupation(s)Businessperson, LGBT rights activistKnown forPresident of Mattachine SocietyMilitary careerAllegiance United StatesService/branch United States ArmyService years1941–1945Rank CaptainBattles/warsPacific WarAwardsPurple Heart Harold Leland Hal Call (September 1917[1] ...

Grigioni italianoStati Svizzera TerritorioMoesa, Bernina, Bregaglia Abitanti15 353 (2020) Lingueitaliano, lombardo Il Grigioni italiano all'interno del Canton Grigioni Il Grigioni italiano (in lombardo alpino Grisgiun itaglian; in tedesco Italienischbünden; in romancio Grischun talian), è l'insieme delle regioni del Cantone dei Grigioni (Svizzera) in cui è prevalente e ufficiale l'uso della lingua italiana, in diglossia con varietà alpine della lingua lombarda. Indice 1 Car...

 

 

عبد الفتاح الوراق معلومات شخصية الميلاد سنة 1955 (العمر 68–69 سنة)  ابن أحمد نازية  مواطنة المغرب  الخدمة العسكرية الفرع القوات البرية الملكية المغربية  الرتبة فريق أول  تعديل مصدري - تعديل   عبد الفتاح الوراق (1955-) هُوَ جنرالٌ في الجيش المغربي. مسيرته عيَّنهُ ا...

 

 

  「大蕃」重定向至此。關於渤海国王子大蕃,請見「大蕃 (渤海国)」。   提示:此条目页的主题不是藏区。 吐蕃大蕃国བོད་ཆེན་པོ།618年—842年 狮子旗吐蕃王国全盛时期版图(推測)(约780年至790年)位置青藏高原一带首都逻些(今拉萨)常用语言藏語宗教苯教,藏传佛教政府君主制赞普 • 618年-650年 松赞干布(首)• 650年-676年 ...

Hino Motors, Ltd.Nama asli日野自動車株式会社Nama latinHino Jidōsha Kabushiki-gaishaJenisPublik (K.K)Kode emitenTYO: 7205IndustriOtomotifPendahuluTokyo Gas and Electric Industry CompanyDidirikan1 May 1942; 82 tahun lalu (1 May 1942)KantorpusatHino, Tokyo, JepangWilayah operasiSeluruh duniaTokohkunciYoshio Shimo (Presiden & CEO)ProdukTruk dan busProduksi 130.075 unit kendaraan (2020)[1]Pendapatan ¥1,498 triliun (FY2021)[note 1][2]Laba operasi ¥12,250...

 

 

For other uses, see Udmurtia (disambiguation). This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Udmurtia – news · newspapers · books · scholar · JSTOR (September 2012) (Learn how and when to remove this message) First-level administrative division of Russia Republic in Volga, RussiaUdmurt RepublicRepublicУд...