Так, FP може використовуватися в корпоративних додатках. Clojure - один із прикладів мови FP з успіхом на підприємстві: http://cognitect.com/clojure#successstories
Представлення стану може бути викликом у FP, а зміна парадигм на FP може бути трохи розумом. Деякі мови FP повністю забороняють побічні впливи та стан змін. Clojure дозволяє обидва, але не відлякує або ізолює ці парадигми.
Коротше кажучи, державне представництво може бути дуже схожим на ОО. Саме модифікація стану дуже відрізняється. Так, наприклад, у FP-стані можуть бути представлені списки та карти. Список працівників може виглядати так:
[[name: "James Brown" address: "Barnwell, SC"]
[name: "Elvis Presley" address: "Tupelo, MS"]]
Я знаю два способи обробляти модифікацію стану в ПП. Одне - це щось на зразок функціонального реактивного програмування. У цій парадигмі всі стани обробляються лише на найвищому рівні ... наприклад, перегляд HTML вашої програми має стан у представленні (наприклад, ім'я, адресу тощо). Тепер, коли ви натискаєте "оновити ім'я", викликається функція, яка обробляє всі речі про оновлення імені, за винятком фактично зміни імені. Це може здатися дивним ... але потерпіть зі мною. Потім змінене ім'я буде повернуто функцією, а в представленні (або постійному сховищі даних тощо) буде показано нове ім'я. Або, як альтернатива, буде повернута ціла нова структура з оновленою назвою. Отже, що робить функція? Він перевіряє ім'я та повертає нове ім'я, якщо воно дійсне, помилка, якщо його немає, і, можливо, новий перегляд або навігаційне посилання, яке слід перейти. Для чогось більш складного, ніж зміна імені, це може зробити набагато більше.
Отже, для FRP об'єкт, повернутий функцією, є новим станом і може бути наданий безпосередньо в представлення даних або будь-якого іншого на високому рівні. У деяких випадках FRP приймає весь стан, передає його у функцію і повертає весь стан назад.
За допомогою цієї парадигми контейнер або рамка повинні обробляти оновлення дисплея, бази даних чи будь-чого іншого, необхідного для оновлення з нового стану. Таким чином, ви можете уявити рамку, яка малює додаток на екрані. Коли користувач натискає щось, викликається функція, і новий стан повертається. Потім рамка оновлює екран, або перемальовуючи все, або розумно перемальовуючи частини дисплея. Дивіться http://blog.getprismatic.com/om-sweet-om-high-functional-frontend-engineering-with-clojurescript-and-react/
Clojure використовує другу парадигму, яку я натрапив, і полягає в тому, щоб виділити зміни стану, але не обов'язково обмежувати їх до найвищого рівня. З Clojure всі зміни, що змінюються, повинні "утримуватися" (якщо ви не використовуєте об'єкти Java для стану) атомом, агентом чи посиланням. Те, як це працює, є об'єктом, який тримається або вказується на нього або посилається на нього (однак ви хочете його назвати) атомом / агентом / ref, є незмінним, але атом / агент / ref може змінитись, щоб вказати на новий об'єкт. У цьому випадку ви використовуєте спеціальні методи на atom / agent / ref, які говорять "оновіть об'єкт тут, роблячи таке і таке, і перепризначивши atom / agent / ref на новий об'єкт".
Чому це корисне ви можете запитати? Оскільки незмінний об'єкт, на який посилаються ці конструкції Clojure, може бути переданий функції, яка щось робить, і поки ця функція працює, її посилання на об'єкт гарантовано не зміниться. Тобто, атом / агент / ref не передається функції, але незмінний об'єкт, на який вказують, передається. Atoms, агенти та refs мають особливі властивості, які обробляють оновлення та паралельність безпечними та частинами мови. Дивіться http://clojure.org/state
Я сподіваюся, що це допомагає. Я пропоную прочитати докладніше про штат Clojure та FRP, щоб краще зрозуміти, як можуть бути представлені працівники та особи у FP. Хоча фактичне представлення було б подібне до об’єктно-орієнтованого програмування ... саме ця мутаційність справді відрізняється.