Функційне програмування — парадигма програмування, яка розглядає програму як обчислення математичних функцій та уникає станів та змінних даних. Функційне програмування наголошує на застосуванні функцій, на відміну від імперативного програмування, яке наголошує на змінах в стані та виконанні послідовностей команд.
Іншими словами, функційне програмування є способом створення програм, в яких єдиною дією є виклик функції, єдиним способом розбиття програми є створення нового імені функції та задання для цього імені виразу, що обчислює значення функції, а єдиним правилом композиції є оператор суперпозиції функцій. Жодних комірок пам'яті, операторів присвоєння, циклів, ні, тим більше, блок-схем чи команд переходу.
Ширша концепція функційного програмування визначає набір спільних правил та тем замість переліку відмінностей від інших парадигм. До таких, що часто вважаються важливими, належать функції вищого порядку та функції першого класу: замикання, та рекурсія. До інших поширених можливостей функційних мов програмування належать продовження, [en], нечіткі обчислення (включно з, але, не обмежуючись, лінивими обчисленнями), та монади.
Основну увагу функційним мовам програмування, особливо, «чисто функційним», приділили академічні дослідники. Однак, до відомих функційних мов програмування, які використовуються в промисловості та комерційному програмуванні належить Erlang (паралельні програми), R (статистика), Mathematica (символьні обчислення), J та K (фінансовий аналіз), та спеціалізовані мови програмування наприклад XSLT. Істотний вплив на функційне програмування здійснило лямбда-числення, мова програмування APL, мова програмування Lisp та новіша мова програмування Haskell.
Функційне програмування часто називають «функціональним», хоча насправді функціонально-орієнтоване програмування — це інша категорія, де основою є компонування програм у ряд програмних продуктів.[]
Мови програмування
Найвідомішими мовами функційного програмування є:
- XQuery;
- Haskell — чиста функційна мова. Названа на честь Гаскелла Каррі;
- Lisp (Джон Маккарті, 1958, має безліч нащадків, найсучасніші з яких — Scheme і Common Lisp);
- ML (Робін Мілнер, 1979, з нині використовуваних діалектів відомі Standard ML і Objective Caml);
- (Девід Тернер, 1985, який згодом дав розвиток мові Haskell);
- Erlang — (Joe Armstrong, 1986) функційна мова з моделлю акторів.
- Nemerle — гібридна функційно/імперативна мова;
- F# — функційна мова для платформи .NET;
- Scala — гібридна об'єктно-орієнтована/функційна мова для платформи Java;
- Clojure — функційна мова для платформи Java.
Ще не повністю функційні початкові версії Lisp і APL зробили особливий внесок до створення і розвитку функційного програмування. Пізніші версії Lisp, такі як Scheme, а також різні варіанти APL, підтримували властивості і концепції функційної мови.
Як правило, інтерес до функційних мов програмування, особливо чисто функційних, був більше науковий, ніж комерційний. Проте, таким примітним мовам як Erlang, OCaml, Haskell, Scheme (після 1986), а так само специфічним R (статистика), Mathematica (символічна математика), J і K (фінансовий аналіз), і XSLT (XML) знаходили застосування в індустрії комерційного програмування. Такі широко поширені декларативні мови як SQL і Lex/Yacc містять деякі елементи функційного програмування, вони остерігаються використовувати змінні.
Історія
Лямбда-числення стало теоретичною базою для опису і обчислення функцій. Будучи математичною абстракцією, а не мовою програмування, воно склало базис майже всіх мов функційного програмування на сьогодні. Подібне теоретичне поняття, комбінаторна логіка, є більш абстрактним, ніж λ-числення і було створено раніше. Ця логіка використовується в деяких езотеричних мовах, наприклад в . І λ-числення, і комбінаторна логіка були розроблені для більш ясного й точного опису принципів і основ математики.
Першою функційною мовою був Lisp, створений Джоном Маккарті в період його роботи в Массачусетському технологічному інституті в кінці п'ятдесятих і реалізований, спочатку, для [en]. Lisp визначив множину понять функційної мови, хоча при цьому сповідував не тільки парадигму функційного програмування . Подальшим розвитком Ліспу стали такі мови як Scheme і Dylan.
Мова обробки інформації ([en], IPL) іноді визначається як найперша машинно-функційна мова. Це мова ассемблерного типу для роботи зі списком символів. У ньому було поняття «генератора», який використовував функцію як аргумент, а також, оскільки це мова ассемблерного рівня, він може позиціонуватися як мова, що має функції вищого порядку. Однак, в цілому IPL акцентовано на використання імперативних понять.
Кеннет Айверсон розробив мову на початку шістдесятих, продокоментувавши її в своїй книзі A Programming Language (). APL справив значний вплив на мову [en], створену Джоном Бекусом. На початку дев'яностих Айверсон і [en] створили наступника APL — мова програмування J. У середині дев'яностих [en], який раніше працював з Айверсоном, створив мову K, яка згодом використовувалась у фінансовій індустрії на комерційній основі.
У сімдесятих в університеті Единбурга Робін Мілнер створив мову ML, а починав розробку мови в і, згодом, мову в університеті міста Кент. У кінцевому підсумку на основі ML були створені кілька мов, серед яких найбільш відомі Objective Caml і . Також в сімдесятих здійснювалася розробка мови програмування, побудованої за принципом Scheme (реалізація не лише функційної парадигми), що отримала опис у відомій роботі «Lambda Papers», а також у книзі вісімдесят п'ятого року , в якій принципи функційного програмування були донесені до більш широкої аудиторії.[]
У вісімдесятих створив інтуїціонистську теорію типів (також звану конструктивною). У цій теорії функційне програмування отримало конструктивний доказ того, що раніше було відомо як залежний тип. Це дало потужний поштовх до розвитку діалогового доказу теорем і до подальшого створення безлічі функційних мов.
Haskell був створений в кінці вісімдесятих у спробі поєднати безліч ідей, отриманих у ході дослідження функційного програмування.
Концепції
Деякі концепції та парадигми специфічні для функційного програмування і в основному чужі імперативному програмуванню (включаючи об'єктно-орієнтоване програмування). Тим не менш, мови програмування звичайно являють собою гібрид декількох парадигм програмування, тому «здебільшого імперативні» мови програмування можуть використовувати які-небудь з цих концепцій.[]
Функції вищих порядків
Функції вищих порядків — це такі функції, які можуть приймати як аргументи і повертати інші функції. Математики таку функцію частіше називають оператором, наприклад, оператор взяття похідної або інтегральний оператор.
Функції вищих порядків дозволяють використовувати каррінг — перетворення функції від пари аргументів у функцію, що бере свої аргументи по одному. Це перетворення отримало свою назву на честь Гаскелла Каррі.
Чисті функції
Чистими називають функції, які не мають побічних ефектів вводу-виводу і пам'яті (вони залежать тільки від своїх параметрів і повертають тільки свій результат). Чисті функції володіють декількома корисними властивостями, багато з яких можна використовувати для оптимізації коду:
- Якщо результат чистої функції не використовується, він може бути видалений без шкоди для інших виразів.
- Результат виклику чистої функції може бути кешований, тобто збережений в таблиці значень разом з аргументами виклику. Якщо надалі функція викликається з цими ж аргументами, її результат може бути взятий прямо з таблиці без її повторного обчислення (іноді це називається принципом прозорості посилань). Кешування, ціною невеликої затрати пам'яті, дозволяє істотно збільшити швидкодію і зменшити глибину рекурсії в деяких алгоритмах.
- Якщо немає ніякої залежності серед даних між двома чистими функціями, то порядок їх обчислення можна поміняти (інакше кажучи обчислення чистих функцій задовольняє принципам thread-safe)
- Якщо вся мова не допускає побічних ефектів, то можна використовувати будь-яку політику обчислення. Це надає свободу компілятору комбінувати і реорганізовувати обчислення виразів у програмі (наприклад, виключити деревоподібні структури).
Хоча більшість компіляторів імперативних мов програмування розпізнають чисті функції і видаляють загальні підвирази для викликів чистих функцій, вони не можуть робити це завжди для попередньо скомпільованих бібліотек, які, як правило, не надають цю інформацію. Деякі компілятори, такі як gcc, з метою оптимізації надають програмісту ключові слова для позначення чистих функцій. Fortran 95 дозволяє позначати функції як «pure».
Рекурсія
У функційних мовах цикл зазвичай реалізується у вигляді рекурсії. Власне, у функційної парадигми програмування немає такого поняття, як цикл. Рекурсивні функції викликають самі себе, дозволяючи операції виконуватися знову і знову. Для використання рекурсії може знадобитися великий стек, але цього можна уникнути в разі хвостової рекурсії. Хвостова рекурсія може бути розпізнана і оптимізована компілятором в код, одержуваний після компіляції, аналогічної ітерації в імперативній мові програмування. Стандарти мови Scheme вимагають розпізнавати і оптимізувати хвостову рекурсію. Оптимізувати хвостову рекурсію можна шляхом перетворення програми в стилі використання продовжень при її компіляції, як один із способів.
Рекурсивні функції можна узагальнити за допомогою функцій вищих порядків, використовуючи, наприклад, катаморфізм і (або «згортка» і «розгорнення»). Функції такого роду відіграють роль такого поняття, як цикл в імперативних мовах програмування.[]
Підхід до обчислення аргументів
функційні мови можна класифікувати по тому, як обробляються аргументи функції в процесі її обчислення. Технічно відмінність полягає в денотаційній семантиці виразу. Наприклад, при строгому підході до обчислення виразу
print (len ([2 +1, 3 * 2, 1/0, 5-4]))
на виході буде помилка, оскільки в третьому елементі списку присутнє ділення на нуль. При нестрогому підході значенням виразу буде 4, оскільки для обчислення довжини списку значення його елементів, строго кажучи, не важливі і можуть взагалі не обчислюватися. При строгому (аплікативному) порядку обчислення заздалегідь підраховуються значення всіх аргументів перед обчисленням самої функції. При нестрогому підході (нормальний порядок обчислення) значення аргументів не обчислюються до тих пір, поки їх значення не знадобляться при обчисленні функції.
Як правило, нестрогий підхід реалізується у вигляді редукції графа. Нестроге обчислення використовується за замовчуванням в декількох чисто функційних мовах, у тому числі , і Haskell.[]
ФП в нефункційних мовах
Принципово немає перешкод для написання програм у функційному стилі на мовах, які традиційно не вважаються функційними, точно так само, як програми в об'єктно-орієнтованому стилі можна писати на структурних мовах. Деякі імперативні мови підтримують типові для функційних мов конструкції, такі як функції вищого порядку і спискові включення (list comprehensions), що полегшує використання функційного стилю в цих мовах. Прикладом може бути програмування на мові Python.
У мові C покажчики на функцію як типи аргументів можуть бути використані для створення функцій вищого порядку. Функції вищого порядку і відкладена списковому структура реалізовані в бібліотеках . У мові C # версії 3.0 і вище можна використовувати λ-функції для написання програми в функційному стилі. У складних мовах, типу Алгол-68, наявні засоби метапрограмування (фактично, доповнення мови новими конструкціями) дозволяють створити специфічні для функційного стилю об'єкти даних і програмні конструкції, після чого можна писати функційні програми з їх використанням.
Структури даних
Чисто функціональні структури даних часто представлені інакше, ніж їх процедурні аналоги. Наприклад, масив з постійним доступом і часом оновлення є основним компонентом більшості імперативних мов, і багато імперативних структур даних, таких як геш-таблиця і двійкова купа, засновані на масивах. Масиви можна замінити асоціативними масивами або списками випадкового доступу, які допускають суто функціональну реалізацію, але мають логарифмічний доступ і час оновлення. Чисто функціональні структури даних мають стійкість, тобкто властивість зберігати попередні версії структури даних незмінними. У Clojure постійні структури даних використовуються як функціональні альтернативи їхнім імперативним аналогам.
Стилі програмування
Імперативні програми мають схильність акцентувати послідовності кроків для виконання якоїсь дії, а функційні програми до розташування і композиції функцій, часто не позначаючи точної послідовності кроків. Простий приклад двох рішень однієї задачі (використовується одна і та ж мова Python) ілюструє це.
# Імперативний стиль target = [] # створити порожній список for item in source_list: # для кожного елемента вихідного списку trans1 = G (item) # застосувати функцію G () trans2 = F (trans1) # застосувати функцію F () target.append (trans2) # додати перетворений елемент у список
функційна версія виглядає інакше:
# функційний стиль # Мови ФП часто мають вбудовану функцію compose () compose2 = lambda A, B: lambda x: A (B (x)) target = map (compose2 (F, G), source_list)
На відміну від імперативного стилю, що описує кроки, що ведуть до досягнення мети, функційний стиль описує математичні відносини між даними і метою.
Особливості
Основною особливістю функційного програмування, яка визначає як переваги, так і недоліки даної парадигми, є те, що в ній реалізується модель обчислень без станів. Якщо імперативна програма на будь-якому етапі виконання має стан, тобто сукупність значень всіх змінних, і виробляє побічні ефекти, то чисто функційна програма ні цілком, ні частинами стану не має і побічних ефектів не виробляє. Те, що в імперативних мовах робиться шляхом присвоювання значень змінним, в функційних досягається шляхом передачі виразів в параметри функцій. Безпосереднім наслідком стає те, що чисто функційна програма не може змінювати вже наявні в ній дані, а може лише породжувати нові, шляхом копіювання та / або розширення старих. Наслідком того ж є відмова від циклів на користь рекурсії.
Сильні сторони
Підвищення надійності коду
Приваблива сторона обчислень без станів — підвищення надійності коду за рахунок чіткої структуризації та відсутності необхідності відстеження побічних ефектів. Будь-яка функція працює тільки з локальними даними і працює з ними завжди однаково, незалежно від того, де, як і за яких обставин вона викликається. Неможливість мутації даних при користуванні ними в різних місцях програми виключає появу помилок, які тяжко виявити (таких, наприклад, як випадкове присвоювання невірного значення глобальній змінній в імперативній програмі).
Зручність організації модульного тестування
Оскільки функція у функційному програмуванні не може породжувати побічні ефекти, змінювати об'єкти не можна як усередині області видимості, так і зовні (на відміну від імперативних програм, де одна функція може встановити яку-небудь зовнішню змінну, що зчитується іншою функцією). Єдиним ефектом від обчислення функції є повернений їй результат, і єдиний чинник, який впливає на результат — це значення аргументів.
Таким чином, є можливість протестувати кожну функцію в програмі, просто обчисливши її від різних наборів значень аргументів. При цьому можна не турбуватися ні про виклик функцій в правильному порядку, ні про правильне формуванні зовнішнього стану. Якщо будь-яка функція в програмі проходить модульні тести, то можна бути впевненим у якості всієї програми. В імперативних програмах перевірка значення, що повертається функції, недостатня: функція може модифікувати зовнішній стан, який теж потрібно перевіряти, чого не потрібно робити в функційних програмах.
Можливості оптимізації при компіляції
Традиційно згадуваною позитивною особливістю функційного програмування є те, що воно дозволяє описувати програму в так званому «декларативному» вигляді, коли жорстка послідовність виконання багатьох операцій, необхідних для обчислення результату, в явному вигляді не задається, а формується автоматично в процесі обчислення функцій. Ця обставина, а також відсутність станів дає можливість застосовувати до функційних програм досить складні методи автоматичної оптимізації.
Можливості паралелізму
Ще однією перевагою функційних програм є те, що вони надають найширші можливості для автоматичного розпаралелювання обчислень. Оскільки відсутність побічних ефектів гарантовано, в будь-якому виклику функції завжди припустиме паралельне обчислення двох різних параметрів — порядок їх обчислення не може вплинути на результат виклику.
Недоліки
Недоліки функційного програмування випливають з тих же самих його особливостей. Відсутність присвоювання і заміна їх на породження нових даних призводять до необхідності постійного виділення та автоматичного звільнення пам'яті, тому в системі виконання функційної програми обов'язковим компонентом стає високоефективний збирач сміття. Нестрога модель обчислень призводить до непередбачуваного порядку виклику функцій, що створює проблеми при введенні-виведенні, де порядок виконання операцій є важливим. Крім того, очевидно, функції введення в своєму природному вигляді (наприклад, getchar із стандартної бібліотеки мови C) не є чистими, оскільки здатні повертати різні значення для одних і тих же аргументів, і для усунення цього потрібні певні хитрощі.
Для подолання недоліків функційних програм вже перші мови функційного програмування включали не тільки чисто функційні засоби, але і механізми імперативного програмування (присвоєння, цикл, «неявний PROGN» були вже в LISP'і). Використання таких засобів дозволяє вирішити деякі практичні проблеми, але означає відхід від ідей (і переваг) функційного програмування і написання імперативних програм функційними мовами. У чистих функційних мовах ці проблеми вирішуються іншими засобами, наприклад, в мові Haskell ввід-вивід реалізований за допомогою монади — нетривіальної концепції, запозиченої з теорії категорій.
Див. також
Примітки
- Хендерсон 1983, Предисловие редактора перевода
- Вольфенгаген В. Э. Конструкции языков программирования. Приемы описания. — М: АО «Центр ЮрИнфоР», 2001. — 276 с .
- Роджер Пенроуз. Глава 2: Лямбда-числення Черча // Новий розум короля. Про комп'ютери, мисленні і законах фізики = The Emperors New Mind: Concerning Computers, Minds and The Laws of Physics. — Едіторіал УРСС, 2003. — . + перевидання ; 2011
- J. Harrison, 1997, Гл. 3. λ-числення як мова програмування.
- У своїх мемуарах Герберт Саймон (1991), Models of My Life pp. 189–190 стверджує, що його, Al. Ньюелл, і Кліфф Шоу яких «часто називають батьками штучного інтелекту» за написання програми [en] автоматично доводить теореми з Principia Mathematica. Для того, щоб досягти цього, вони повинні були придумати мову і парадигму, яку, ретроспективно, можна розглядати як функційне програмування.
- . Архів оригіналу за 1 листопада 2006. Процитовано 6 грудня 2012.
- XIV. APL Session // History of Programming Language / Richard L. Wexelbblat. — Academic Press, 1981. — С. 661—693. — .
- [en] (September 1989). Conception, evolution, and application of functional programming languages . ACM Computing Surveys. 21 (3): 359 −411.
- В. А. Потапенко. Функції вищих порядків. Техніки функційного програмування. с. 8.
- GCC , Declaring Attributes of Functions
- XL Fortran for AIX, V13.1 Language Reference, Pure procedures (Fortran 95)]
- Tail call optimization
- Revised5 Report on the Algorithmic Language Scheme, 3.5. Proper tail recursion
- Н. А. Роганова функційне програмування: Навчальний посібник для студентів вищих навчальних закладів — М.: ГІНФО, 2002. — 260 с. Стор. 14 п. 3.1. Ледачі і енергійні обчислення
- Okasaki, Chris (1998). Purely functional data structures. Cambridge, U.K.: Cambridge University Press. ISBN . OCLC 822565696.
- Ахмечет В . «функційне програмування для всіх»
Література
- Функційне програмування : Навч. посіб. для студ. вищих навч. закл., що навч. за спец. "Програм. забезп. автоматиз. систем" / В. М. Заяць; Нац. ун-т "Львів. політехніка". - Л. : Бескид Біт, 2003. - 159 c. - Бібліогр.: 15 назв.
Додаткова література
- Судомир В. Використання функційної парадигми при програмуванні мікроконтролерів //Матеріали Ⅱ Міжнародної студентської науково-технічної конференції „Природничі та гуманітарні науки. Актуальні питання “. – 2019. – С. 52-52
Джерела інформації
- Functional programming — стаття в англомовній вікіпедії.
- Peter Henderson, Functional Programming Application and Implementation, 1980. П. Хендерсон, Функциональное программирование, применение и реализация, перевод с англ. Москва, Мир, 1983
Посилання
- Why functional programming matters, by John Hughes, The Computer Journal, Vol. 32, No. 2, 1989, pp. 98 — 107. — про переваги функційного програмування.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Funkcijne programuvannya paradigma programuvannya yaka rozglyadaye programu yak obchislennya matematichnih funkcij ta unikaye staniv ta zminnih danih Funkcijne programuvannya nagoloshuye na zastosuvanni funkcij na vidminu vid imperativnogo programuvannya yake nagoloshuye na zminah v stani ta vikonanni poslidovnostej komand Inshimi slovami funkcijne programuvannya ye sposobom stvorennya program v yakih yedinoyu diyeyu ye viklik funkciyi yedinim sposobom rozbittya programi ye stvorennya novogo imeni funkciyi ta zadannya dlya cogo imeni virazu sho obchislyuye znachennya funkciyi a yedinim pravilom kompoziciyi ye operator superpoziciyi funkcij Zhodnih komirok pam yati operatoriv prisvoyennya cikliv ni tim bilshe blok shem chi komand perehodu Shirsha koncepciya funkcijnogo programuvannya viznachaye nabir spilnih pravil ta tem zamist pereliku vidminnostej vid inshih paradigm Do takih sho chasto vvazhayutsya vazhlivimi nalezhat funkciyi vishogo poryadku ta funkciyi pershogo klasu zamikannya ta rekursiya Do inshih poshirenih mozhlivostej funkcijnih mov programuvannya nalezhat prodovzhennya en nechitki obchislennya vklyuchno z ale ne obmezhuyuchis linivimi obchislennyami ta monadi Osnovnu uvagu funkcijnim movam programuvannya osoblivo chisto funkcijnim pridilili akademichni doslidniki Odnak do vidomih funkcijnih mov programuvannya yaki vikoristovuyutsya v promislovosti ta komercijnomu programuvanni nalezhit Erlang paralelni programi R statistika Mathematica simvolni obchislennya J ta K finansovij analiz ta specializovani movi programuvannya napriklad XSLT Istotnij vpliv na funkcijne programuvannya zdijsnilo lyambda chislennya mova programuvannya APL mova programuvannya Lisp ta novisha mova programuvannya Haskell Funkcijne programuvannya chasto nazivayut funkcionalnim hocha naspravdi funkcionalno oriyentovane programuvannya ce insha kategoriya de osnovoyu ye komponuvannya program u ryad programnih produktiv dzherelo Movi programuvannyaNajvidomishimi movami funkcijnogo programuvannya ye XQuery Haskell chista funkcijna mova Nazvana na chest Gaskella Karri Lisp Dzhon Makkarti 1958 maye bezlich nashadkiv najsuchasnishi z yakih Scheme i Common Lisp ML Robin Milner 1979 z nini vikoristovuvanih dialektiv vidomi Standard ML i Objective Caml Devid Terner 1985 yakij zgodom dav rozvitok movi Haskell Erlang Joe Armstrong 1986 funkcijna mova z modellyu aktoriv Nemerle gibridna funkcijno imperativna mova F funkcijna mova dlya platformi NET Scala gibridna ob yektno oriyentovana funkcijna mova dlya platformi Java Clojure funkcijna mova dlya platformi Java She ne povnistyu funkcijni pochatkovi versiyi Lisp i APL zrobili osoblivij vnesok do stvorennya i rozvitku funkcijnogo programuvannya Piznishi versiyi Lisp taki yak Scheme a takozh rizni varianti APL pidtrimuvali vlastivosti i koncepciyi funkcijnoyi movi Yak pravilo interes do funkcijnih mov programuvannya osoblivo chisto funkcijnih buv bilshe naukovij nizh komercijnij Prote takim primitnim movam yak Erlang OCaml Haskell Scheme pislya 1986 a tak samo specifichnim R statistika Mathematica simvolichna matematika J i K finansovij analiz i XSLT XML znahodili zastosuvannya v industriyi komercijnogo programuvannya Taki shiroko poshireni deklarativni movi yak SQL i Lex Yacc mistyat deyaki elementi funkcijnogo programuvannya voni osterigayutsya vikoristovuvati zminni IstoriyaLyambda chislennya stalo teoretichnoyu bazoyu dlya opisu i obchislennya funkcij Buduchi matematichnoyu abstrakciyeyu a ne movoyu programuvannya vono sklalo bazis majzhe vsih mov funkcijnogo programuvannya na sogodni Podibne teoretichne ponyattya kombinatorna logika ye bilsh abstraktnim nizh l chislennya i bulo stvoreno ranishe Cya logika vikoristovuyetsya v deyakih ezoterichnih movah napriklad v I l chislennya i kombinatorna logika buli rozrobleni dlya bilsh yasnogo j tochnogo opisu principiv i osnov matematiki Pershoyu funkcijnoyu movoyu buv Lisp stvorenij Dzhonom Makkarti v period jogo roboti v Massachusetskomu tehnologichnomu instituti v kinci p yatdesyatih i realizovanij spochatku dlya en Lisp viznachiv mnozhinu ponyat funkcijnoyi movi hocha pri comu spoviduvav ne tilki paradigmu funkcijnogo programuvannya Podalshim rozvitkom Lispu stali taki movi yak Scheme i Dylan Mova obrobki informaciyi en IPL inodi viznachayetsya yak najpersha mashinno funkcijna mova Ce mova assemblernogo tipu dlya roboti zi spiskom simvoliv U nomu bulo ponyattya generatora yakij vikoristovuvav funkciyu yak argument a takozh oskilki ce mova assemblernogo rivnya vin mozhe pozicionuvatisya yak mova sho maye funkciyi vishogo poryadku Odnak v cilomu IPL akcentovano na vikoristannya imperativnih ponyat Kennet Ajverson rozrobiv movu na pochatku shistdesyatih prodokomentuvavshi yiyi v svoyij knizi A Programming Language ISBN 9780471430148 APL spraviv znachnij vpliv na movu en stvorenu Dzhonom Bekusom Na pochatku dev yanostih Ajverson i en stvorili nastupnika APL mova programuvannya J U seredini dev yanostih en yakij ranishe pracyuvav z Ajversonom stvoriv movu K yaka zgodom vikoristovuvalas u finansovij industriyi na komercijnij osnovi U simdesyatih v universiteti Edinburga Robin Milner stvoriv movu ML a pochinav rozrobku movi v i zgodom movu v universiteti mista Kent U kincevomu pidsumku na osnovi ML buli stvoreni kilka mov sered yakih najbilsh vidomi Objective Caml i Takozh v simdesyatih zdijsnyuvalasya rozrobka movi programuvannya pobudovanoyi za principom Scheme realizaciya ne lishe funkcijnoyi paradigmi sho otrimala opis u vidomij roboti Lambda Papers a takozh u knizi visimdesyat p yatogo roku v yakij principi funkcijnogo programuvannya buli doneseni do bilsh shirokoyi auditoriyi dzherelo U visimdesyatih stvoriv intuyicionistsku teoriyu tipiv takozh zvanu konstruktivnoyu U cij teoriyi funkcijne programuvannya otrimalo konstruktivnij dokaz togo sho ranishe bulo vidomo yak zalezhnij tip Ce dalo potuzhnij poshtovh do rozvitku dialogovogo dokazu teorem i do podalshogo stvorennya bezlichi funkcijnih mov Haskell buv stvorenij v kinci visimdesyatih u sprobi poyednati bezlich idej otrimanih u hodi doslidzhennya funkcijnogo programuvannya KoncepciyiDeyaki koncepciyi ta paradigmi specifichni dlya funkcijnogo programuvannya i v osnovnomu chuzhi imperativnomu programuvannyu vklyuchayuchi ob yektno oriyentovane programuvannya Tim ne mensh movi programuvannya zvichajno yavlyayut soboyu gibrid dekilkoh paradigm programuvannya tomu zdebilshogo imperativni movi programuvannya mozhut vikoristovuvati yaki nebud z cih koncepcij dzherelo Funkciyi vishih poryadkiv Dokladnishe Funkciya vishogo poryadku Funkciyi vishih poryadkiv ce taki funkciyi yaki mozhut prijmati yak argumenti i povertati inshi funkciyi Matematiki taku funkciyu chastishe nazivayut operatorom napriklad operator vzyattya pohidnoyi abo integralnij operator Funkciyi vishih poryadkiv dozvolyayut vikoristovuvati karring peretvorennya funkciyi vid pari argumentiv u funkciyu sho bere svoyi argumenti po odnomu Ce peretvorennya otrimalo svoyu nazvu na chest Gaskella Karri Chisti funkciyi Chistimi nazivayut funkciyi yaki ne mayut pobichnih efektiv vvodu vivodu i pam yati voni zalezhat tilki vid svoyih parametriv i povertayut tilki svij rezultat Chisti funkciyi volodiyut dekilkoma korisnimi vlastivostyami bagato z yakih mozhna vikoristovuvati dlya optimizaciyi kodu Yaksho rezultat chistoyi funkciyi ne vikoristovuyetsya vin mozhe buti vidalenij bez shkodi dlya inshih viraziv Rezultat vikliku chistoyi funkciyi mozhe buti keshovanij tobto zberezhenij v tablici znachen razom z argumentami vikliku Yaksho nadali funkciya viklikayetsya z cimi zh argumentami yiyi rezultat mozhe buti vzyatij pryamo z tablici bez yiyi povtornogo obchislennya inodi ce nazivayetsya principom prozorosti posilan Keshuvannya cinoyu nevelikoyi zatrati pam yati dozvolyaye istotno zbilshiti shvidkodiyu i zmenshiti glibinu rekursiyi v deyakih algoritmah Yaksho nemaye niyakoyi zalezhnosti sered danih mizh dvoma chistimi funkciyami to poryadok yih obchislennya mozhna pominyati inakshe kazhuchi obchislennya chistih funkcij zadovolnyaye principam thread safe Yaksho vsya mova ne dopuskaye pobichnih efektiv to mozhna vikoristovuvati bud yaku politiku obchislennya Ce nadaye svobodu kompilyatoru kombinuvati i reorganizovuvati obchislennya viraziv u programi napriklad viklyuchiti derevopodibni strukturi Hocha bilshist kompilyatoriv imperativnih mov programuvannya rozpiznayut chisti funkciyi i vidalyayut zagalni pidvirazi dlya viklikiv chistih funkcij voni ne mozhut robiti ce zavzhdi dlya poperedno skompilovanih bibliotek yaki yak pravilo ne nadayut cyu informaciyu Deyaki kompilyatori taki yak gcc z metoyu optimizaciyi nadayut programistu klyuchovi slova dlya poznachennya chistih funkcij Fortran 95 dozvolyaye poznachati funkciyi yak pure Rekursiya Dokladnishe Rekursiya U funkcijnih movah cikl zazvichaj realizuyetsya u viglyadi rekursiyi Vlasne u funkcijnoyi paradigmi programuvannya nemaye takogo ponyattya yak cikl Rekursivni funkciyi viklikayut sami sebe dozvolyayuchi operaciyi vikonuvatisya znovu i znovu Dlya vikoristannya rekursiyi mozhe znadobitisya velikij stek ale cogo mozhna uniknuti v razi hvostovoyi rekursiyi Hvostova rekursiya mozhe buti rozpiznana i optimizovana kompilyatorom v kod oderzhuvanij pislya kompilyaciyi analogichnoyi iteraciyi v imperativnij movi programuvannya Standarti movi Scheme vimagayut rozpiznavati i optimizuvati hvostovu rekursiyu Optimizuvati hvostovu rekursiyu mozhna shlyahom peretvorennya programi v stili vikoristannya prodovzhen pri yiyi kompilyaciyi yak odin iz sposobiv Rekursivni funkciyi mozhna uzagalniti za dopomogoyu funkcij vishih poryadkiv vikoristovuyuchi napriklad katamorfizm i abo zgortka i rozgornennya Funkciyi takogo rodu vidigrayut rol takogo ponyattya yak cikl v imperativnih movah programuvannya dzherelo Pidhid do obchislennya argumentiv funkcijni movi mozhna klasifikuvati po tomu yak obroblyayutsya argumenti funkciyi v procesi yiyi obchislennya Tehnichno vidminnist polyagaye v denotacijnij semantici virazu Napriklad pri strogomu pidhodi do obchislennya virazu print len 2 1 3 2 1 0 5 4 na vihodi bude pomilka oskilki v tretomu elementi spisku prisutnye dilennya na nul Pri nestrogomu pidhodi znachennyam virazu bude 4 oskilki dlya obchislennya dovzhini spisku znachennya jogo elementiv strogo kazhuchi ne vazhlivi i mozhut vzagali ne obchislyuvatisya Pri strogomu aplikativnomu poryadku obchislennya zazdalegid pidrahovuyutsya znachennya vsih argumentiv pered obchislennyam samoyi funkciyi Pri nestrogomu pidhodi normalnij poryadok obchislennya znachennya argumentiv ne obchislyuyutsya do tih pir poki yih znachennya ne znadoblyatsya pri obchislenni funkciyi Yak pravilo nestrogij pidhid realizuyetsya u viglyadi redukciyi grafa Nestroge obchislennya vikoristovuyetsya za zamovchuvannyam v dekilkoh chisto funkcijnih movah u tomu chisli i Haskell dzherelo FP v nefunkcijnih movah Principovo nemaye pereshkod dlya napisannya program u funkcijnomu stili na movah yaki tradicijno ne vvazhayutsya funkcijnimi tochno tak samo yak programi v ob yektno oriyentovanomu stili mozhna pisati na strukturnih movah Deyaki imperativni movi pidtrimuyut tipovi dlya funkcijnih mov konstrukciyi taki yak funkciyi vishogo poryadku i spiskovi vklyuchennya list comprehensions sho polegshuye vikoristannya funkcijnogo stilyu v cih movah Prikladom mozhe buti programuvannya na movi Python U movi C pokazhchiki na funkciyu yak tipi argumentiv mozhut buti vikoristani dlya stvorennya funkcij vishogo poryadku Funkciyi vishogo poryadku i vidkladena spiskovomu struktura realizovani v bibliotekah C U movi C versiyi 3 0 i vishe mozhna vikoristovuvati l funkciyi dlya napisannya programi v funkcijnomu stili U skladnih movah tipu Algol 68 nayavni zasobi metaprogramuvannya faktichno dopovnennya movi novimi konstrukciyami dozvolyayut stvoriti specifichni dlya funkcijnogo stilyu ob yekti danih i programni konstrukciyi pislya chogo mozhna pisati funkcijni programi z yih vikoristannyam Strukturi danih Chisto funkcionalni strukturi danih chasto predstavleni inakshe nizh yih procedurni analogi Napriklad masiv z postijnim dostupom i chasom onovlennya ye osnovnim komponentom bilshosti imperativnih mov i bagato imperativnih struktur danih takih yak gesh tablicya i dvijkova kupa zasnovani na masivah Masivi mozhna zaminiti asociativnimi masivami abo spiskami vipadkovogo dostupu yaki dopuskayut suto funkcionalnu realizaciyu ale mayut logarifmichnij dostup i chas onovlennya Chisto funkcionalni strukturi danih mayut stijkist tobkto vlastivist zberigati poperedni versiyi strukturi danih nezminnimi U Clojure postijni strukturi danih vikoristovuyutsya yak funkcionalni alternativi yihnim imperativnim analogam Stili programuvannyaImperativni programi mayut shilnist akcentuvati poslidovnosti krokiv dlya vikonannya yakoyis diyi a funkcijni programi do roztashuvannya i kompoziciyi funkcij chasto ne poznachayuchi tochnoyi poslidovnosti krokiv Prostij priklad dvoh rishen odniyeyi zadachi vikoristovuyetsya odna i ta zh mova Python ilyustruye ce Imperativnij stil target stvoriti porozhnij spisok for item in source list dlya kozhnogo elementa vihidnogo spisku trans1 G item zastosuvati funkciyu G trans2 F trans1 zastosuvati funkciyu F target append trans2 dodati peretvorenij element u spisok funkcijna versiya viglyadaye inakshe funkcijnij stil Movi FP chasto mayut vbudovanu funkciyu compose compose2 lambda A B lambda x A B x target map compose2 F G source list Na vidminu vid imperativnogo stilyu sho opisuye kroki sho vedut do dosyagnennya meti funkcijnij stil opisuye matematichni vidnosini mizh danimi i metoyu OsoblivostiOsnovnoyu osoblivistyu funkcijnogo programuvannya yaka viznachaye yak perevagi tak i nedoliki danoyi paradigmi ye te sho v nij realizuyetsyamodel obchislen bez staniv Yaksho imperativna programa na bud yakomu etapi vikonannya maye stan tobto sukupnist znachen vsih zminnih i viroblyaye pobichni efekti to chisto funkcijna programa ni cilkom ni chastinami stanu ne maye i pobichnih efektiv ne viroblyaye Te sho v imperativnih movah robitsya shlyahom prisvoyuvannya znachen zminnim v funkcijnih dosyagayetsya shlyahom peredachi viraziv v parametri funkcij Bezposerednim naslidkom staye te sho chisto funkcijna programa ne mozhe zminyuvati vzhe nayavni v nij dani a mozhe lishe porodzhuvati novi shlyahom kopiyuvannya ta abo rozshirennya starih Naslidkom togo zh ye vidmova vid cikliv na korist rekursiyi Silni storoni Pidvishennya nadijnosti kodu Privabliva storona obchislen bez staniv pidvishennya nadijnosti kodu za rahunok chitkoyi strukturizaciyi ta vidsutnosti neobhidnosti vidstezhennya pobichnih efektiv Bud yaka funkciya pracyuye tilki z lokalnimi danimi i pracyuye z nimi zavzhdi odnakovo nezalezhno vid togo de yak i za yakih obstavin vona viklikayetsya Nemozhlivist mutaciyi danih pri koristuvanni nimi v riznih miscyah programi viklyuchaye poyavu pomilok yaki tyazhko viyaviti takih napriklad yak vipadkove prisvoyuvannya nevirnogo znachennya globalnij zminnij v imperativnij programi Zruchnist organizaciyi modulnogo testuvannya Oskilki funkciya u funkcijnomu programuvanni ne mozhe porodzhuvati pobichni efekti zminyuvati ob yekti ne mozhna yak useredini oblasti vidimosti tak i zovni na vidminu vid imperativnih program de odna funkciya mozhe vstanoviti yaku nebud zovnishnyu zminnu sho zchituyetsya inshoyu funkciyeyu Yedinim efektom vid obchislennya funkciyi ye povernenij yij rezultat i yedinij chinnik yakij vplivaye na rezultat ce znachennya argumentiv Takim chinom ye mozhlivist protestuvati kozhnu funkciyu v programi prosto obchislivshi yiyi vid riznih naboriv znachen argumentiv Pri comu mozhna ne turbuvatisya ni pro viklik funkcij v pravilnomu poryadku ni pro pravilne formuvanni zovnishnogo stanu Yaksho bud yaka funkciya v programi prohodit modulni testi to mozhna buti vpevnenim u yakosti vsiyeyi programi V imperativnih programah perevirka znachennya sho povertayetsya funkciyi nedostatnya funkciya mozhe modifikuvati zovnishnij stan yakij tezh potribno pereviryati chogo ne potribno robiti v funkcijnih programah Mozhlivosti optimizaciyi pri kompilyaciyi Tradicijno zgaduvanoyu pozitivnoyu osoblivistyu funkcijnogo programuvannya ye te sho vono dozvolyaye opisuvati programu v tak zvanomu deklarativnomu viglyadi koli zhorstka poslidovnist vikonannya bagatoh operacij neobhidnih dlya obchislennya rezultatu v yavnomu viglyadi ne zadayetsya a formuyetsya avtomatichno v procesi obchislennya funkcij Cya obstavina a takozh vidsutnist staniv daye mozhlivist zastosovuvati do funkcijnih program dosit skladni metodi avtomatichnoyi optimizaciyi Mozhlivosti paralelizmu She odniyeyu perevagoyu funkcijnih program ye te sho voni nadayut najshirshi mozhlivosti dlya avtomatichnogo rozparalelyuvannya obchislen Oskilki vidsutnist pobichnih efektiv garantovano v bud yakomu vikliku funkciyi zavzhdi pripustime paralelne obchislennya dvoh riznih parametriv poryadok yih obchislennya ne mozhe vplinuti na rezultat vikliku Nedoliki Nedoliki funkcijnogo programuvannya viplivayut z tih zhe samih jogo osoblivostej Vidsutnist prisvoyuvannya i zamina yih na porodzhennya novih danih prizvodyat do neobhidnosti postijnogo vidilennya ta avtomatichnogo zvilnennya pam yati tomu v sistemi vikonannya funkcijnoyi programi obov yazkovim komponentom staye visokoefektivnij zbirach smittya Nestroga model obchislen prizvodit do neperedbachuvanogo poryadku vikliku funkcij sho stvoryuye problemi pri vvedenni vivedenni de poryadok vikonannya operacij ye vazhlivim Krim togo ochevidno funkciyi vvedennya v svoyemu prirodnomu viglyadi napriklad getchar iz standartnoyi biblioteki movi C ne ye chistimi oskilki zdatni povertati rizni znachennya dlya odnih i tih zhe argumentiv i dlya usunennya cogo potribni pevni hitroshi Dlya podolannya nedolikiv funkcijnih program vzhe pershi movi funkcijnogo programuvannya vklyuchali ne tilki chisto funkcijni zasobi ale i mehanizmi imperativnogo programuvannya prisvoyennya cikl neyavnij PROGN buli vzhe v LISP i Vikoristannya takih zasobiv dozvolyaye virishiti deyaki praktichni problemi ale oznachaye vidhid vid idej i perevag funkcijnogo programuvannya i napisannya imperativnih program funkcijnimi movami U chistih funkcijnih movah ci problemi virishuyutsya inshimi zasobami napriklad v movi Haskell vvid vivid realizovanij za dopomogoyu monadi netrivialnoyi koncepciyi zapozichenoyi z teoriyi kategorij Div takozhKategoriya Funkcijni movi programuvannya Formalni metodi Nezminnij ob yekt Invariant programuvannya Lyambda chislennya Paradigma programuvannya Porivnyannya mov programuvannya KatamorfizmPrimitkiHenderson 1983 Predislovie redaktora perevoda Volfengagen V E Konstrukcii yazykov programmirovaniya Priemy opisaniya M AO Centr YurInfoR 2001 276 s ISBN 5 89158 079 9 Rodzher Penrouz Glava 2 Lyambda chislennya Chercha Novij rozum korolya Pro komp yuteri mislenni i zakonah fiziki The Emperors New Mind Concerning Computers Minds and The Laws of Physics Editorial URSS 2003 ISBN 5 354 00005 X perevidannya ISBN 978 5 382 01266 7 2011 J Harrison 1997 Gl 3 l chislennya yak mova programuvannya U svoyih memuarah Gerbert Sajmon 1991 Models of My Life pp 189 190 ISBN 0 465 04640 1 stverdzhuye sho jogo Al Nyuell i Kliff Shou yakih chasto nazivayut batkami shtuchnogo intelektu za napisannya programi en avtomatichno dovodit teoremi z Principia Mathematica Dlya togo shob dosyagti cogo voni povinni buli pridumati movu i paradigmu yaku retrospektivno mozhna rozglyadati yak funkcijne programuvannya Arhiv originalu za 1 listopada 2006 Procitovano 6 grudnya 2012 XIV APL Session History of Programming Language Richard L Wexelbblat Academic Press 1981 S 661 693 ISBN 0 12 745040 8 en September 1989 Conception evolution and application of functional programming languages ACM Computing Surveys 21 3 359 411 V A Potapenko Funkciyi vishih poryadkiv Tehniki funkcijnogo programuvannya s 8 GCC Declaring Attributes of Functions XL Fortran for AIX V13 1 Language Reference Pure procedures Fortran 95 Tail call optimization Revised5 Report on the Algorithmic Language Scheme 3 5 Proper tail recursion N A Roganova funkcijne programuvannya Navchalnij posibnik dlya studentiv vishih navchalnih zakladiv M GINFO 2002 260 s Stor 14 p 3 1 Ledachi i energijni obchislennya Okasaki Chris 1998 Purely functional data structures Cambridge U K Cambridge University Press ISBN 978 1 139 81174 3 OCLC 822565696 Ahmechet V funkcijne programuvannya dlya vsih LiteraturaFunkcijne programuvannya Navch posib dlya stud vishih navch zakl sho navch za spec Program zabezp avtomatiz sistem V M Zayac Nac un t Lviv politehnika L Beskid Bit 2003 159 c Bibliogr 15 nazv Dodatkova literaturaSudomir V Vikoristannya funkcijnoyi paradigmi pri programuvanni mikrokontroleriv Materiali Mizhnarodnoyi studentskoyi naukovo tehnichnoyi konferenciyi Prirodnichi ta gumanitarni nauki Aktualni pitannya 2019 S 52 52Dzherela informaciyiFunctional programming stattya v anglomovnij vikipediyi Peter Henderson Functional Programming Application and Implementation 1980 P Henderson Funkcionalnoe programmirovanie primenenie i realizaciya perevod s angl Moskva Mir 1983PosilannyaWhy functional programming matters by John Hughes The Computer Journal Vol 32 No 2 1989 pp 98 107 pro perevagi funkcijnogo programuvannya