- Основні ідеї
- характеристики
- Чисті функції
- Особливості першого класу
- Референційна прозорість
- Рекурсія
- Незмінюваність
- Приклади
- Імперативний та декларативний підходи
- Чисті функції
- Функціонує як першокласні об'єкти
- Перевага
- Коротше і простіше зрозуміти
- Відсутній контрольний потік
- Недоліки
- Програми
- Функціональна методологія
- Мови, що підтримують функціональне програмування
- D
- Ерланг
- Хаскелл
- ML
- Об'єктивний Caml
- Схема
- Список літератури
У функціональному програмуванні відповідає програмування шаблону заснований на концепції про те , поведінка програми в якості функціональної математичної моделі , а не явні послідовності інструкцій для процесора, який є основним поняттям в імперативний програмуванні.
Функціональна мова підкреслює висловлювання та терміни, а не виконання тверджень. У цьому програмуванні результат буде залежати лише від параметрів, які передаються функції, на відміну від інших типів, які підкоряються локальному або глобальному стану.
Діаграма того, як функція відображення функціонує на мові функціонального програмування Haskell. Джерело: Pluke - Власна робота, CC0 commons.wikimedia.org.
Його назва походить від математичних функцій, які є присвоєнням набору входів набору виходів. Математична функція насправді не виконує жодної роботи, а скоріше описує модель процесу, пояснюючи за допомогою формули, що набір входів виробляє у функції.
Основні ідеї
Основою, на якій базувалося функціональне програмування, було обчислення лямбда, розроблене протягом третього десятиліття 20 століття для визначення та застосування функцій. LISP була першою подібною мовою програмування, розробленою в 1960 році.
Хоча більшість мов програмування складаються з входів, виходів та зовнішніх змінних, які можна встановити або використовувати в межах функцій, функціональне програмування цього уникає. Ідея полягає в тому, що кожного разу, коли функція викликається з однаковими параметрами, вона повинна повертати одне і те ж значення.
характеристики
Мови функціонального програмування називаються програмами, оскільки функції застосовуються до їх параметрів, а також декларативні та непроцедурні, оскільки визначення визначають, що слід обчислювати, а не як його обчислювати.
Чисті функції
Функція є чистою, коли вона не має помітних побічних ефектів, таких як зміна зовнішніх змінних, зміни файлової системи тощо.
Ці функції вважаються переконливими, оскільки вони прямо не змінять змінних, від яких в певний момент можуть залежати інші частини коду. Код з цими обмеженнями здасться незручним, але ці функції слід вважати детермінованими, передбачуваними та складовими.
Особливості першого класу
Функції розглядаються як значення, яким можна присвоїти змінні, тому їх можна передавати та повертати з інших функцій. Тобто функція може використовуватися так, ніби вона була параметром або як значення, яке повертається.
Це означає, що функція може передаватися як така, а не просто результат функції. Наприклад, розглянемо подвійну (x) функцію, яка повертає вдвічі більше значення вхідного параметра. Таким чином, подвійний (2) поверне 4.
Оскільки це функція першого класу, код (подвійний (подвійний (2)) буде таким самим, як і подвійний (4) код. Це дозволяє вкладати одну функцію в параметр іншої тощо.
Референційна прозорість
Він посилається на той факт, що в цій схемі програмування немає заяв про призначення. Тобто ви повинні визначити нові змінні, якщо хочете зберегти додаткові значення. Тому стан змінної є постійним у всі часи.
Це виключає найменшу можливість небажаних ефектів, оскільки будь-яка змінна може бути замінена її реальним значенням під час будь-якої точки виконання програми.
Рекурсія
У функціональному програмуванні немає циклів "для" і "поки". Натомість ітерація спирається на рекурсію. Рекурсія реалізується за допомогою рекурсивних функцій, які називають себе повторно, поки не буде досягнуто базового випадку.
Незмінюваність
Змінні незмінні, тобто неможливо змінити змінну після її ініціалізації. Хоча ви можете створити нову змінну, зміна існуючих змінних заборонено.
Приклади
Імперативний та декларативний підходи
На прикладі ви можете проаналізувати різницю між цими підходами, виконуючи одну і ту ж операцію в обох домовленостях, яка полягає у фільтрації непарних чисел зі списку, замінюючи 5 на парні числа менше 5.
Це той самий розрахунок, з тим самим результатом. Однак, як бачите, імперативний код є багатослівним і не відразу зрозумілим. З іншого боку, декларативний підхід є читабельним і явним, оскільки фокусується на тому, що ви хочете отримати.
Чисті функції
Що визначається як чисті та нечисті функції, можна пояснити на деяких основних прикладах:
Функціонує як першокласні об'єкти
Це означає використовувати функції так само, як і дані. Тому їх можна передати як параметри іншій функції. У наступному прикладі функцію int можна передавати як параметр функції карти:
>>> список (карта (int,))
Їх можна присвоїти змінним і повернути. Наприклад, у наступному коді ви можете призначити функцію hello_world, а потім виконати змінну як функцію.
Перевага
- Зосередьтеся на тому, що ви хочете досягти (декларативне), а не на тому, як цього досягти (імператив).
- Вони не містять операторів призначення, тому після того, як змінним буде надано значення, вони більше не змінюватимуться. Тому функціональні програми не містять побічних ефектів.
- Логічний потік зрозумілий, оскільки стан менш диспергований і не неявно модифікований.
- Підтримує концепцію ледачої оцінки, що означає, що значення оцінюється і зберігається лише при необхідності.
- Оскільки чисті функції не змінюють жодного стану і повністю залежать від введення, їх легко зрозуміти. Повернене значення, яке задаються такими функціями, те саме, що і результат, отриманий ними.
- Через характер чистих функцій, щоб уникнути зміни змінних чи будь-яких зовнішніх даних, реалізація паралельності стає ефективною.
- Функції трактуються як значення, переходять до інших функцій як параметри. Це покращує розуміння та читаність коду.
- Чисті функції приймають параметри один раз, даючи незмінний вихід. Використання незмінних значень спрощує налагодження та тестування.
Коротше і простіше зрозуміти
Вони коротші та легші для розуміння, ніж імперативи. Дослідження показали, що середня продуктивність програміста з точки зору рядків коду є більш-менш однаковою для будь-якої мови програмування, що означає більш високу продуктивність.
Відсутній контрольний потік
Виклик функції не може мати іншого ефекту, ніж обчислення її результату. Це виключає основне джерело помилок, а також робить порядок виконання нерелевантним, оскільки жоден побічний ефект не може змінити значення виразу, і його можна оцінити в будь-який час.
Програміст звільняється від тягаря встановлення потоку контролю. Оскільки вирази можна оцінити в будь-який час, змінні можуть бути замінені їх значеннями.
Ця автономія робить функціональні програми більш математично керованими, ніж звичайні програми.
Недоліки
- Парадигма функціонального програмування не проста, тому початківцю важко зрозуміти.
- Це важко підтримувати, оскільки під час кодування розвивається багато об'єктів.
- У деяких випадках написання чистих функцій викликає зменшення читабельності коду.
- Незмінні значення в поєднанні з рекурсією можуть призвести до різкого зниження продуктивності системи.
- Повторне використання дуже складне і вимагає постійного рефакторингу.
- Написання програм у рекурсивному стилі замість використання циклів або циклів може бути дуже непростим завданням.
- Об'єкти можуть не відображати проблему правильно.
- Хоча запис чистих функцій виявляється простим, поєднувати їх з рештою програми та операціями введення / виводу досить складно.
Програми
Програмування штучного інтелекту виконується на функціональних мовах програмування, а методи штучного інтелекту переходять на додатки реального світу.
Він також видатний у реалізації складних математичних моделей. З цієї причини одне з основних застосувань функціональних мов традиційно є академічним. Це корисно для розробки виконавчих специфікацій та реалізації прототипу.
Багато функціональних мов також досконалі при здійсненні паралельної обробки. Це пов’язано з його здатністю використовувати переваги чистих функцій, які завжди повертають однакове значення незалежно від порядку, в якому вони виконуються.
Функціональна методологія
WhatsApp використовує мову програмування Erlang, яка дотримується функціональної моделі програмування, що дозволяє більше сотні своїх співробітників обробляти дані, що належать приблизно 1,6 мільярдам людей.
Ще одним важливим носієм стилю функціонального програмування є Haskell. Він використовується Facebook у своїй антиспам. Навіть JavaScript, одна з найбільш широко використовуваних мов програмування, виставляє властивості динамічно набраної функціональної мови.
Мови, що підтримують функціональне програмування
D
Він був розроблений після C ++, отримуючи всі його переваги, усуваючи спостережувані недоліки того, що він повинен бути сумісним із C.
Ерланг
Він високомасштабний та одночасний, що робить його ідеальним для телекомунікаційних та інших програм, які отримують величезну кількість даних у непередбачуваному порядку.
Хаскелл
Це чиста функціональна мова програмування, в якій використовується обчислення лямбда.
ML
Застосовується в математичних, наукових, фінансових, аналітичних та інших програмах. Однією з його сильних сторін є створення програмного забезпечення для управління іншими програмами.
Об'єктивний Caml
Це мова з відкритим кодом, заснована на Caml. Він схильний створювати дуже легкі програми, допомагаючи їм завантажуватися та працювати швидше, ніж ті, які створені іншими мовами.
Схема
Він заснований на синтаксисі LISP та структурі ALGOL. Через свою простоту він використовується на багатьох курсах інформатики як вступ до дизайну програм, щоб показати деякі основи комп'ютерного програмування.
Список літератури
- Хто це хостинг (2019). Дізнайтеся про функціональне програмування: Цей стиль кодування підірве ваш розум. Взято з: whoishostingthis.com.
- Андреа Бертолі (2019). Адекватний вступ до функціонального програмування. Взято з: dev.to.
- Хакерська Земля (2020). Функціональне програмування. Взято з: hackerearth.com.
- Clojure (2020). Функціональне програмування. Взято з: clojure.org.
- Ахіл Бхадвал (2020). Функціональне програмування: поняття, переваги, недоліки та програми. Рубати. Взято з: hackr.io.
- Гуру99 (2020). Що таке функціональне програмування? Підручник з прикладом. Взято з: guru99.com.