Да, 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"]]
Есть два способа обработки состояний в FP. Одним из них является что-то вроде функционально-реактивного программирования. В этой парадигме все состояния обрабатываются только на самом высоком уровне ... например, 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, которые говорят «обновите объект, выполнив то-то и то-то и переназначив атом / agent / ref новому объекту».
Почему это полезно, спросите вы? Поскольку неизменяемый объект, на который ссылаются эти конструкции Clojure, может быть передан функции, которая что-то делает, и во время выполнения этой функции его ссылка на объект гарантированно не изменится. То есть atom / agent / ref не передается в функцию, но неизменный объект, на который они указывают, передается. Атомы, агенты и ссылки имеют специальные свойства, которые обрабатывают обновления и параллелизм безопасными и частью языка. Смотрите http://clojure.org/state
Надеюсь, это поможет. Я предлагаю прочитать больше о Clojure State и FRP, чтобы лучше понять, как сотрудники и лица могут быть представлены в FP. Хотя фактическое представление будет похоже на объектно-ориентированное программирование ... это изменчивость, которая действительно отличается.