В інформатиці мова програмування має функції першого класу, якщо вона розглядає функції як об'єкти першого класу.Зокрема, це означає, що мова підтримує передачу функцій як аргументів інших функцій, повернення їх як результат інших функцій, присвоювання їх змінним або збереження в структурах даних. Деякі теоретики мов програмування вважають необхідною умовою також підтримку анонімних функцій. У мовах з функціями першого класу імена функцій не мають ніякого спеціального статусу, вони розглядаються як звичайні значення, тип яких є функціональним. Термін був вперше використаний Крістофером Стречі в контексті «функції як об'єкти першого класу» в середині 1960-х.
Функції першого класу є невід'ємною частиною функціонального програмування, в якому використання функцій вищого порядку є стандартною практикою. Простим прикладом функції вищого порядку буде функція Map, яка приймає функцію і список як свої аргументи і повертає список, після застосування функції до кожного елементу списку. Щоб мова програмування підтримувала Map, вона повинна підтримувати передачу функцій як аргументу.
Існують деякі складності в реалізації передачі функцій як аргументів і повернення їх як результату, особливо за присутності нелокальних змінних, введених у вкладених і анонімних функціях. Історично вони були названі проблемами фунарга, від англійського «function argument». У ранніх імперативних мовах програмування ці проблеми обходилися шляхом відмови від підтримки повернення функцій як результату або відмови від вкладених функцій і отже нелокальних змінних (зокрема, C). Lisp, одна з перших функціональних мов програмування, застосовує підхід динамічної області видимості, де нелокальні змінні повертають найближче визначення цих змінних до точки, у якій функція була викликана, замість точки, у якій вона була оголошена. Повноцінна підтримка для лексичного контексту функцій першого порядку була введена в Scheme і передбачає обробку посилань на функції як замикань замість чистих, що, в свою чергу, робить необхідним застосування збірки сміття.
Концепції
У цій секції розглядається, як конкретні ідіоми програмування реалізуються в функціональних мовах з функціями першого порядку (Haskell) порівняно з імперативними мовами, де функції — об'єкти другого порядку (C).
Функції вищого порядку: передача функції як аргументу
У мовах, де функції - це об'єкти першого порядку, функції можуть бути передані як аргументи для інших функцій так само як і будь-які інші значення. Так, наприклад, в Haskell:
map :: (a -> b) -> [a] -> [b] map f [] = [] map f (x:xs) = f x : map f xs
Мови, де функції не є об'єктами першого порядку, дозволяють реалізовувати функції вищого порядку за допомогою використання таких прийомів як делегування. Вказівники у мові C з деякими обмеженнями дозволяють будувати функції вищого порядку (можна передавати і повертати адресу іменованої функції, але не можна породжувати нові функції):
void map(int (*f)(int), int x[], size_t n) { for (int i = 0; i < n; i++) x[i] = f(x[i]); }
Анонімні і вкладені функції
У мовах, що підтримують анонімні функції, можна передати таку функцію як аргумент функції вищого порядку:
main = map (\x -> 3 * x + 1) [1, 2, 3, 4, 5]
У мовах, що не підтримують анонімні функції, необхідно спершу зв'язати функцію з іменем:
int f(int x) { return 3 * x + 1; } int main() { int l[] = {1, 2, 3, 4, 5}; map(f, l, 5); }
Нелокальні змінні та замикання
Якщо мова програмування підтримує анонімні або вкладені функції досить логічно припускати, що вони будуть посилатися на змінні за межами тіла функції:
main = let a = 3 b = 1 in map (\x -> a * x + b) [1, 2, 3, 4, 5]
Якщо функції представлені у формі чистих, виникає питання того, як же передавати значення за межами тіла функції. У такому випадку доводиться будувати замикання вручну, і на цьому етапі говорити про функції першого класу не доводиться.
typedef struct { int (*f)(int, int, int); int *a; int *b; } closure_t; void map(closure_t *closure, int x[], size_t n) { for (int i = 0; i < n; ++i) x[i] = (*closure->f)(*closure->a, *closure->b, x[i]); } int f(int a, int b, int x) { return a * x + b; } void main() { int l[] = {1, 2, 3, 4, 5}; int a = 3; int b = 1; closure_t closure = {f, &a, &b}; map(&closure, l, 5); }
Функції вищого порядку: повернення функцій як результату
При поверненні функції насправді відбувається повернення її замикання. У прикладі на С всі локальні змінні, укладені в замикання вийдуть з області видимості як тільки програми вийде з функції, яка становить замикання. Форсування замикання в подальшому може призвести до невизначеного поведінки.
Див. також
Примітки
- ; (1984). . MIT Press. Section 1.3 Formulating Abstractions with Higher-Order Procedures. ISBN .
- Programming language pragmatics, by Michael Lee Scott, section 11.2 «Functional Programming».
- Roberto Ierusalimschy; Luiz Henrique de Figueiredo; Waldemar Celes. The Implementation of Lua 5.0 (PDF).
- Rod Burstall, «Christopher Strachey—Understanding Programming Languages», 13:52 (2000)
- . «The Function of FUNCTION in LISP, or Why the FUNARG Problem Should be Called the Environment Problem». MIT AI Memo 199, 1970.
Посилання
- First-class functions on .
- Higher order functions at
Література
- . . CSE5317/CSE4305: Design and Construction of Compilers. University of Texas at Arlington.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V informatici mova programuvannya maye funkciyi pershogo klasu yaksho vona rozglyadaye funkciyi yak ob yekti pershogo klasu Zokrema ce oznachaye sho mova pidtrimuye peredachu funkcij yak argumentiv inshih funkcij povernennya yih yak rezultat inshih funkcij prisvoyuvannya yih zminnim abo zberezhennya v strukturah danih Deyaki teoretiki mov programuvannya vvazhayut neobhidnoyu umovoyu takozh pidtrimku anonimnih funkcij U movah z funkciyami pershogo klasu imena funkcij ne mayut niyakogo specialnogo statusu voni rozglyadayutsya yak zvichajni znachennya tip yakih ye funkcionalnim Termin buv vpershe vikoristanij Kristoferom Strechi v konteksti funkciyi yak ob yekti pershogo klasu v seredini 1960 h Funkciyi pershogo klasu ye nevid yemnoyu chastinoyu funkcionalnogo programuvannya v yakomu vikoristannya funkcij vishogo poryadku ye standartnoyu praktikoyu Prostim prikladom funkciyi vishogo poryadku bude funkciya Map yaka prijmaye funkciyu i spisok yak svoyi argumenti i povertaye spisok pislya zastosuvannya funkciyi do kozhnogo elementu spisku Shob mova programuvannya pidtrimuvala Map vona povinna pidtrimuvati peredachu funkcij yak argumentu Isnuyut deyaki skladnosti v realizaciyi peredachi funkcij yak argumentiv i povernennya yih yak rezultatu osoblivo za prisutnosti nelokalnih zminnih vvedenih u vkladenih i anonimnih funkciyah Istorichno voni buli nazvani problemami funarga vid anglijskogo function argument U rannih imperativnih movah programuvannya ci problemi obhodilisya shlyahom vidmovi vid pidtrimki povernennya funkcij yak rezultatu abo vidmovi vid vkladenih funkcij i otzhe nelokalnih zminnih zokrema C Lisp odna z pershih funkcionalnih mov programuvannya zastosovuye pidhid dinamichnoyi oblasti vidimosti de nelokalni zminni povertayut najblizhche viznachennya cih zminnih do tochki u yakij funkciya bula viklikana zamist tochki u yakij vona bula ogoloshena Povnocinna pidtrimka dlya leksichnogo kontekstu funkcij pershogo poryadku bula vvedena v Scheme i peredbachaye obrobku posilan na funkciyi yak zamikan zamist chistih sho v svoyu chergu robit neobhidnim zastosuvannya zbirki smittya KoncepciyiU cij sekciyi rozglyadayetsya yak konkretni idiomi programuvannya realizuyutsya v funkcionalnih movah z funkciyami pershogo poryadku Haskell porivnyano z imperativnimi movami de funkciyi ob yekti drugogo poryadku C Funkciyi vishogo poryadku peredacha funkciyi yak argumentu U movah de funkciyi ce ob yekti pershogo poryadku funkciyi mozhut buti peredani yak argumenti dlya inshih funkcij tak samo yak i bud yaki inshi znachennya Tak napriklad v Haskell map a gt b gt a gt b map f map f x xs f x map f xs Movi de funkciyi ne ye ob yektami pershogo poryadku dozvolyayut realizovuvati funkciyi vishogo poryadku za dopomogoyu vikoristannya takih prijomiv yak deleguvannya Vkazivniki u movi C z deyakimi obmezhennyami dozvolyayut buduvati funkciyi vishogo poryadku mozhna peredavati i povertati adresu imenovanoyi funkciyi ale ne mozhna porodzhuvati novi funkciyi void map int f int int x size t n for int i 0 i lt n i x i f x i Anonimni i vkladeni funkciyi U movah sho pidtrimuyut anonimni funkciyi mozhna peredati taku funkciyu yak argument funkciyi vishogo poryadku main map x gt 3 x 1 1 2 3 4 5 U movah sho ne pidtrimuyut anonimni funkciyi neobhidno spershu zv yazati funkciyu z imenem int f int x return 3 x 1 int main int l 1 2 3 4 5 map f l 5 Nelokalni zminni ta zamikannya Yaksho mova programuvannya pidtrimuye anonimni abo vkladeni funkciyi dosit logichno pripuskati sho voni budut posilatisya na zminni za mezhami tila funkciyi main let a 3 b 1 in map x gt a x b 1 2 3 4 5 Yaksho funkciyi predstavleni u formi chistih vinikaye pitannya togo yak zhe peredavati znachennya za mezhami tila funkciyi U takomu vipadku dovoditsya buduvati zamikannya vruchnu i na comu etapi govoriti pro funkciyi pershogo klasu ne dovoditsya typedef struct int f int int int int a int b closure t void map closure t closure int x size t n for int i 0 i lt n i x i closure gt f closure gt a closure gt b x i int f int a int b int x return a x b void main int l 1 2 3 4 5 int a 3 int b 1 closure t closure f amp a amp b map amp closure l 5 Funkciyi vishogo poryadku povernennya funkcij yak rezultatu Pri povernenni funkciyi naspravdi vidbuvayetsya povernennya yiyi zamikannya U prikladi na S vsi lokalni zminni ukladeni v zamikannya vijdut z oblasti vidimosti yak tilki programi vijde z funkciyi yaka stanovit zamikannya Forsuvannya zamikannya v podalshomu mozhe prizvesti do neviznachenogo povedinki Div takozhLyambda virazi Funkcionalnij tipPrimitki 1984 MIT Press Section 1 3 Formulating Abstractions with Higher Order Procedures ISBN 0 262 01077 1 Programming language pragmatics by Michael Lee Scott section 11 2 Functional Programming Roberto Ierusalimschy Luiz Henrique de Figueiredo Waldemar Celes The Implementation of Lua 5 0 PDF Rod Burstall Christopher Strachey Understanding Programming Languages 13 52 2000 The Function of FUNCTION in LISP or Why the FUNARG Problem Should be Called the Environment Problem MIT AI Memo 199 1970 PosilannyaFirst class functions on Higher order functions atLiteratura CSE5317 CSE4305 Design and Construction of Compilers University of Texas at Arlington