В інформатиці мову програмування має функції першого класу. якщо він розглядає функції як об'єкти першого класу. Зокрема, це означає, що мова підтримує передачу функцій в якості аргументів інших функцій, повернення їх як результат інших функцій, присвоювання їх змінним або збереження в структурах даних. [1] Деякі теоретики мов програмування вважають необхідною умовою також підтримку анонімних функцій. [2] У мовах з функціями першого класу імена функцій не мають ніякого спеціального статусу, вони розглядаються як звичайні значення, тип яких є функціональним. [3] Термін був вперше використаний Крістофером Стречі [en] в контексті «функції як об'єкти першого класу» в середині 1960-х. [4]
Функції першого класу є невід'ємною частиною функціонального програмування. в якому використання функцій вищого порядку є стандартною практикою. Простим прикладом функції вищого порядку буде функція Map. яка приймає в якості своїх аргументів функцію і список і повертається список, після застосування функції до кожного елементу списку. Щоб мову програмування підтримував Map. він повинен підтримувати передачу функцій як аргументу.
Існують деякі складності в реалізації передачі функцій як аргументів і повернення їх як результату, особливо в присутності нелокальних змінних. введених у вкладених і анонімних функціях. Історично вони були названі проблемами фунарга. від англійського «function argument». [5] У ранніх імперативних мовах програмування ці проблеми обходилися шляхом відмови від підтримки повернення функцій як результату або відмови від вкладених функцій і отже нелокальних змінних (зокрема, C). Lisp. один з перших функціональних мов програмування, застосовує підхід динамічної області видимості. де нелокальних змінні повертають найближчим визначення цих змінних до точки, в якій функція була викликана, замість точки, в якій вона була оголошена. Повноцінна підтримка для лексичного контексту функцій першого порядку була введена в Scheme і передбачає обробку посилань на функції як замикань замість чистих [4]. що, в свою чергу, робить необхідним застосування збірки сміття.
У цій секції розглядається, як конкретні ідіоми програмування реалізуються в функціональних мовах з функціями першого порядку (Haskell) порівняно з імперативними мовами, де функції - об'єкти другого порядку (C).
Функції вищого порядку: передача функції як аргумент
У мовах, де функції - це об'єкти першого порядку, функції можуть бути передані як аргументи інших функцій так само як і будь-які інші значення. Так, наприклад, в Haskell:
Мови, де функції не є об'єктами першого порядку, дозволяють реалізовувати функції вищого порядку за допомогою використання таких прийомів як делегування.
Анонімні і вкладені функції
У мовах, що підтримують анонімні функції, можна передати таку функцію як аргумент функції вищого порядку:
У мовах, що не підтримують анонімних функцій, необхідно спершу пов'язати [en] функцію з ім'ям:
Нелокальні змінні і замикання
Якщо мова програмування підтримує анонімні або вкладені функції досить логічно припускати, що вони будуть посилатися на змінні за межами тіла функції:
Якщо функції представлені у формі чистих, виникає питання того, як же передавати значення за межами тіла функції. У такому випадку доводиться будувати замикання вручну, і на цьому етапі говорити про функції першого класу не доводиться.
Функції вищого порядку: повернення функцій як результату
При поверненні функції насправді відбувається повернення її замикання. У прикладі на С всі локальні змінні, укладені в замикання вийдуть з області видимості як тільки програми вийде з функції, яка становить замикання. Форсування замикання в подальшому може призвести до невизначеного поведінки.