Funcții de primă clasă

În domeniul informaticii, limba de programare are funcții de primă clasă. Dacă tratează funcțiile ca obiecte din clasa întâi. În special, aceasta înseamnă că limbajul acceptă transmiterea funcțiilor ca argumente către alte funcții, returnându-le ca rezultat al altor funcții, atribuindu-le variabilelor sau salvându-le în structurile de date. [1] Unii teoreticieni de limbi de programare consideră că este necesar să susțină și funcțiile anonime. [2] În limbile cu funcții de primă clasă, denumirile funcțiilor nu au un statut special, ele sunt tratate ca valori obișnuite, ale căror tipuri sunt funcționale. [3] Termenul a fost folosit pentru prima oară de Christopher Strachey în contextul "funcțiilor ca obiecte de primă clasă" la mijlocul anilor '60. [4]







Funcțiile primei clase sunt parte integrantă a programării funcționale. în care utilizarea funcțiilor de ordin superior este o practică standard. Un exemplu simplu al unei funcții de ordin superior este funcția Map. care ia argumentele sale o funcție și o listă și returnează o listă, după aplicarea funcției la fiecare element al listei. Că limba de programare este susținută de Map. trebuie să susțină transferul de funcții ca argument.

Există unele dificultăți în punerea în aplicare a transferului de funcții ca argumente și returnarea acestora ca rezultat, în special în prezența variabilelor nonlocale. introduse în funcții imbricate și anonime. Din punct de vedere istoric, ele au fost numite problemele lui Furarga. din argumentul funcției engleze. [5] La începutul anilor limbajele de programare imperative aceste probleme tratate prin refuzul de a returna funcțiile de suport, ca rezultat al sau refuzul funcțiilor imbricate, deci și variabile non-locale (de exemplu, C). Lisp. una dintre primele limbi de programare funcțională, aplică abordarea dinamică a domeniului. unde variabilele nonlocale returnează cea mai apropiată definiție a acestor variabile până la punctul în care a fost apelată funcția, în locul punctului la care a fost declarată. Suportul complet pentru contextul lexical al unei funcții de prim ordin a fost introdus în schema și presupune prelucrarea de trimiteri la funcția ca și circuitele în loc de pur [4]. care, la rândul său, face necesară folosirea colecției de gunoi.







Această secțiune discută despre modul în care expresii de programare specifice în limbaje funcționale sunt puse în aplicare cu funcții de prim ordin (Haskell) relativ la limbi imperative, în cazul în care funcțiile - obiecte de ordinul al doilea (C).

Funcții de ordin superior: trecerea unei funcții ca argument

În limbile în care funcțiile sunt obiecte de prim ordin, funcțiile pot fi transmise ca argumente prin alte funcții, precum și prin orice alte valori. De exemplu, în Haskell:

Limbile, în care funcțiile nu sunt obiecte de ordinul întâi, vă permit să implementați funcții de ordin superior folosind tehnici precum delegarea.

Funcții anonime și imbricate

În limbile care acceptă funcții anonime, puteți trece această funcție ca argument la o funcție de ordin superior:

În limbile care nu acceptă funcții anonime, trebuie mai întâi să asociați funcția [en] cu numele:

Variabile și închideri nonlocale

Dacă limbajul de programare acceptă funcții anonime sau imbricate, este logic să presupunem că vor face trimitere la variabile în afara corpului funcției:

Dacă funcțiile sunt reprezentate sub forma celor pure, se pune întrebarea cum să transferăm valori în afara corpului funcției. În acest caz, este necesar să se construiască închiderea manuală și, în acest stadiu, nu este necesar să se vorbească despre funcțiile primei clase.

Funcții de comandă superioare: ca rezultat, funcțiile de returnare

Când funcția revine, aceasta returnează închiderea. În exemplul C, toate variabilele locale închise în închidere vor ieși din domeniul de aplicare de îndată ce programul va ieși din funcția care constituie închiderea. Forțând o închidere în viitor poate duce la un comportament nedefinit.







Articole similare

Trimiteți-le prietenilor: