Що таке функціональне програмування stack overflow російською

Функціональне програмування - спосіб організації обчислень без стану. Строго кажучи, стан у такий програми звичайно є, це - сукупність контекстів всіх її функцій. Але: головна проблема, що стоїть за складнощами стану, ідентичності і зміни, полягає в тому, що, запровадивши присвоювання, ми змушені внести в свої обчислювальні моделі поняття часу (time). До того, як з'явилося присвоювання, наші програми іноді не залежали - в тому сенсі, що будь-яке вираження, що володіє значенням, завжди мало один і той же значення.

На практиці, використовуючи ФП ви йдете від простого до складного: організуєте залежності, відносини, перетворення і композиції функцій. Способи робити це - суть методології ФП. Функції ваші а передусім "чисті", що не мутують зовнішнього контексту, а їх результат залежить тільки від переданих параметрів. ФП повністю позбавляє від можливості здійснення цілого класу помилок (див. SICP Х. Абельсон, Д. Д. Сассман. Гл. "Пастки імперативного програмування").

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

ФП протиставляють ООП а передусім тому, що в зворотну сторону пішла хвиля хайпа, створена свого часу навколо Java і C ++. Виявилося, що бібліотеки шаблонів і багаторівневі ієрархії об'єктів не вирішили всіх проблем, навіть навпаки, створивши нові. Як і раніше безконтрольно зростає складність програмних систем, а відповідно і їх вартість. Тут ми спостерігаємо раціональне звернення галузі до фундаментальних основ, що має на меті зменшити ентропію.

відповідь дан 10 Вересня '15 о 20:38

В імперативний підході (а ООП може бути їм, і зазвичай їм і є), програміст розписує, як саме потрібно виконувати його програму.

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

Всякі лямбда, map / reduce ще не роблять програмування функціональним.

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

В імперативний підході потрібно детально розписати кожен крок і в правильній послідовності. У функціональному просто - обчислювальні все це, ось тобі функція. І рантайм сам зрозуміє, як саме це обчислити, можливо переставивши деякі розрахунки місцями. Також у функціональному підході активно використовується "ледачий підхід", коли деякі функції можуть не обчислюватися до тих пір, поки вони реально не знадобляться. І якщо, наприклад, рантайм бачить, що потрібно обчислити вираз сложная_функція (1,2) / сложная_функція (1,2). то він просто пише 1 і навіть не обчислює - тому що немає сенсу. В імперативний підході компілятор теоретично може зробити таку оптимізацію, але для цього йому потрібно проаналізувати функцію і переконатися, що вона не має побічних ефектів і тому подібне.

відповідь дан 20 Квітня '15 в 8:16

Відповідь хороший, спасибі. Тобто функціональне програмування - це активне використання функцій як параметрів і результатів в д.р. функціях і незмінні змінні, правильно? P.S. а "що потрібно зробити" і "обчислювальні все це, ось тобі функція" - це вже магія, а не програмування, краще відредагувати відповідь. - hardsky 20 Квітня '15 о 8:39

Схожі статті