Які переваги функціонального програмування? [зачинено]


95

Як ви вважаєте, в чому перевага функціонального програмування? І як вони застосовуються до програмістів сьогодні?

Які найбільші відмінності між функціональним програмуванням та ООП?


5
Парадокс Blub. paulgraham.com/avg.html
missingfaktor

Відповіді:


75

Стиль функціонального програмування полягає в тому, щоб описувати те, що ви хочете, а не як його отримати. тобто: замість того, щоб створювати цикл for зі змінною ітератора і проходити по масиву, роблячи щось для кожної комірки, ви б сказали, що еквівалент "ця мітка відноситься до версії цього масиву, де ця функція була виконана на всіх елементи ".

Функціональне програмування переміщує основні ідеї програмування до компілятора, такі як розуміння списків та кешування.

Найбільшою перевагою функціонального програмування є стислість, оскільки код може бути більш стислим. Функціональна програма не створює змінну ітератора, щоб бути центром циклу, тому цей та інші види накладних витрат виключаються з вашого коду.

Іншою основною перевагою є паралельність, що простіше зробити з функціональним програмуванням, оскільки компілятор піклується про більшість операцій, які раніше вимагали вручну встановлювати змінні стану (наприклад, ітератор у циклі).

Деякі переваги продуктивності можна побачити і в контексті одного процесора, залежно від способу написання програми, оскільки більшість функціональних мов та розширень підтримують ледаче оцінювання. У Haskell ви можете сказати "ця мітка представляє масив, що містить усі парні числа". Такий масив нескінченно великий, але ви можете в будь-який момент попросити 100 000-й елемент цього масиву, не знаючи - під час ініціалізації масиву - саме найбільше значення, яке вам знадобиться. Значення буде розраховано лише тоді, коли воно вам знадобиться, і не далі.


12
Я вважаю, що ваш перший абзац ближче до опису декларативного реляційного програмування, такого як Пролог, ніж функціональне програмування.
McPherrinM

6
@McPherrinM: функціональні мови декларативні, а не імперативні.
Lie Ryan

2
Здається, ви плутаєте DP проти IP, з процедурним проти FP . FP передбачає відокремлення проблем, підкреслюючи склад функцій, тобто розділяючи залежності між підрозрахунками детермінованого обчислення.
Шелбі Мур III

2
@LieRyan неправильно. Будь ласка, перегляньте посилання у моєму попередньому коментарі
Шелбі Мур III

Паралельність має кілька потоків, які можуть взаємодіяти один з одним, що є надзвичайно важливим. Виконання кількох незалежних обчислень одночасно називається паралелізмом . Див. En.wikipedia.org/wiki/Concurrency_(computer_science)
Фея Лямбда

29

Найбільша перевага полягає в тому, що це не те, до чого ви звикли. Виберіть таку мову, як Scheme, і навчіться вирішувати з нею проблеми, і ви станете кращим програмістом на мовах, які ви вже знаєте. Це як вивчення другої людської мови. Ви припускаєте, що інші - це, власне, варіація, тому що у вас немає з чим порівняти. Вплив на інших, зокрема тих, які не пов’язані з тим, що ви вже знаєте, є повчальним.


28
це користь від її вивчення, а не користь від самої парадигми
Мо

2
Але чи справді вони окремі? З точки зору початкового допитувача, я б сказав, що ні - вони, швидше за все, шукають вигод у цілому, витрачаючи зусилля на вивчення функціональної мови.
Kendall Helmstetter Gelner

3
"це користь від її вивчення, а не користь від самої парадигми". Парадигма потрапить до вашої іншої роботи з ООП і може допомогти спростити ваш розвиток там. Ви можете вирішити проблеми з "обчислення цього виводу з цього входу" і "складання цих двох функцій, які обчислюють нові дані", а не "чекати --- який стан там була якась спільна змінна?" і "чи я змусив ці процедури виконувати у правильному порядку?". Серйозно кажучи, ви отримуєте ці переваги (від розуміння парадигми FP) у Python, C #, C ++, Java.
Джаред Апдайк,

11

Чому функціональне програмування має значення
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Анотація

У міру того, як програмне забезпечення стає все більш і більш складним, все важливіше добре його структурувати. Добре структуроване програмне забезпечення легко писати та налагоджувати, і воно забезпечує набір модулів, які можна використовувати повторно для зменшення майбутніх витрат на програмування.

У цій роботі ми показуємо, що дві особливості функціональних мов, зокрема, функції вищого порядку та ледача оцінка, можуть суттєво сприяти модульності. Як приклади, ми маніпулюємо списками та деревами, програмуємо кілька числових алгоритмів та впроваджуємо альфа-бета-евристику (алгоритм зі штучного інтелекту, що використовується в ігрових програмах). Ми прийшли до висновку, що оскільки модульність є запорукою успішного програмування, функціональне програмування пропонує важливі переваги для розробки програмного забезпечення.


10

Тому гарною відправною точкою було б спробувати зрозуміти деякі речі, які неможливі в імперативних мовах, але можливі у функціональних мовах.

Якщо ви говорите про обчислюваність, то, звичайно, нічого не можливо у функціональному, але не імперативному програмуванні (або навпаки).

Сенс різних парадигм програмування полягає не в тому, щоб зробити можливим те, що було неможливим раніше, а в тому, щоб полегшити речі, які були важкими раніше.

Функціональне програмування має на меті дозволити вам легше писати стислі програми, що не містять помилок і розпаралелюються.


5

Це не повинно бути тим чи іншим: використання такої мови, як C # 3.0, дозволяє поєднувати найкращі елементи кожного. OO може бути використаний для великомасштабної структури на рівні класу та вище, Функціональний стиль для маломасштабної структури на рівні методу.

Використання функціонального стилю дозволяє писати код, який чітко заявляє про свої наміри, не змішуючи його з операторами потоку керування тощо. Через такі принципи, як програмування побічних ефектів, набагато простіше міркувати про код і перевіряти його правильність .


5

Я думаю, що найбільш практичним прикладом необхідності функціонального програмування є паралельність - функціональні програми, природно, безпечні для потоків, і, враховуючи зростання багатоядерного обладнання, це надзвичайно важливо.

Функціональне програмування також збільшує модульність - ви часто можете бачити методи / функції в імперативі, які занадто довгі - ви майже ніколи не побачите функцію довжиною більше декількох рядків. І оскільки все роз’єднано - повторне використання значно покращено, а модульне тестування дуже просто.


3

Коли програма зростає, кількість команд у нашому словниковому запасі стає занадто великою, що ускладнює використання. Саме тут об’єктно-орієнтоване програмування полегшує наше життя, оскільки дозволяє нам краще організувати наші команди. Ми можемо пов’язати всі команди, які залучають клієнта, до якоїсь сутності замовника (класу), що робить опис набагато зрозумілішим. Однак програма все ще є послідовністю команд, що вказують, як вона повинна діяти.

Функціональне програмування забезпечує зовсім інший спосіб розширення словникового запасу. Не обмежуючись додаванням нових примітивних команд; ми також можемо додати нові структури управління - примітиви, які визначають, як ми можемо складати команди разом для створення програми. В імперативних мовах ми змогли складати команди в послідовності або використовуючи обмежену кількість вбудованих конструкцій, таких як цикли, але якщо ви подивитеся на типові програми, ви все одно побачите багато повторюваних структур; типові способи комбінування команд


1

Не думайте про функціональне програмування з точки зору "потреби". Натомість думайте про це як про інший прийом програмування, який відкриє вам розум так само, як ООП, шаблони, мова асемблер тощо можуть повністю змінити ваш спосіб мислення, коли (якщо) ви їх вивчили. Зрештою, вивчення функціонального програмування зробить вас кращим програмістом.


0

Якщо ви ще не знаєте функціонального програмування, тоді вивчення дасть вам більше способів вирішити проблеми.

FP - це просте узагальнення, яке підвищує функції до першокласних значень, тоді як OOP призначений для широкомасштабного структурування коду. Однак є деяке перекриття, коли шаблони проектування ООП можуть бути представлені безпосередньо та набагато лаконічніше, використовуючи першокласні функції.

Багато мов забезпечують як FP, так і OOP, включаючи OCaml, C # 3.0 та F #.

Ура, Джон Харроп.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.